Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorover0219 <over0219@umn.edu>2020-06-10 02:13:56 +0300
committerover0219 <over0219@umn.edu>2020-06-10 02:13:56 +0300
commit9819c3576cdce6c5f9efca1a821997a856ad66d7 (patch)
treeeb64726c94c866c1c2f549d16e95072a61d29c11 /source
parent5128d86a6f587bd49eaf2207c7b1d5c67b1ff728 (diff)
working on interface
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_mesh_remesh_voxel.h4
-rw-r--r--source/blender/blenkernel/intern/mesh_remesh_voxel.c31
-rw-r--r--source/blender/blenkernel/intern/softbody.c153
-rw-r--r--source/blender/editors/object/object_remesh.c7
-rw-r--r--source/blender/makesdna/DNA_object_force_types.h4
5 files changed, 160 insertions, 39 deletions
diff --git a/source/blender/blenkernel/BKE_mesh_remesh_voxel.h b/source/blender/blenkernel/BKE_mesh_remesh_voxel.h
index 15569406680..f44276adac1 100644
--- a/source/blender/blenkernel/BKE_mesh_remesh_voxel.h
+++ b/source/blender/blenkernel/BKE_mesh_remesh_voxel.h
@@ -57,7 +57,9 @@ struct Mesh *BKE_mesh_remesh_quadriflow_to_mesh_nomain(struct Mesh *mesh,
bool adaptive_scale,
void *update_cb,
void *update_cb_data);
-struct Mesh *BKE_mesh_remesh_tetgen_to_mesh_nomain(struct Mesh *mesh);
+struct Mesh *BKE_mesh_remesh_tetgen_to_mesh_nomain(struct Mesh *mesh,
+ unsigned int **tets,
+ int *numtets);
/* Data reprojection functions */
void BKE_mesh_remesh_reproject_paint_mask(struct Mesh *target, struct Mesh *source);
diff --git a/source/blender/blenkernel/intern/mesh_remesh_voxel.c b/source/blender/blenkernel/intern/mesh_remesh_voxel.c
index c3423c682c9..018c13b65a7 100644
--- a/source/blender/blenkernel/intern/mesh_remesh_voxel.c
+++ b/source/blender/blenkernel/intern/mesh_remesh_voxel.c
@@ -265,7 +265,9 @@ static Mesh *BKE_mesh_remesh_quadriflow(Mesh *input_mesh,
#endif
#ifdef WITH_TETGEN
-static Mesh *BKE_mesh_remesh_tetgen(Mesh *input_mesh)
+static Mesh *BKE_mesh_remesh_tetgen(Mesh *input_mesh,
+ unsigned int **tets,
+ int *numtets)
{
// Ensure that the triangulated mesh data is up to data
BKE_mesh_runtime_looptri_recalc(input_mesh);
@@ -310,6 +312,19 @@ static Mesh *BKE_mesh_remesh_tetgen(Mesh *input_mesh)
MEM_freeN(faces);
MEM_freeN(verttri);
+{
+ if (tg.out_verts)
+ MEM_freeN(tg.out_verts);
+
+ if (tg.out_facets)
+ MEM_freeN(tg.out_facets);
+
+ if (tg.out_tets)
+ MEM_freeN(tg.out_tets);
+
+ return NULL;
+}
+
Mesh *mesh = NULL;
if (success)
{
@@ -333,9 +348,10 @@ static Mesh *BKE_mesh_remesh_tetgen(Mesh *input_mesh)
BKE_mesh_calc_edges(mesh, false, false);
BKE_mesh_calc_normals(mesh);
-// mesh->tottet = tg.out_tottets;
-// mesh->mtet = (unsigned int *)MEM_malloc_arrayN(tg.out_tottets*4, sizeof(unsigned int), "remesh_output_tets");
-// memcpy(mesh->mtet,tg.out_tets,tg.out_tottets*4*sizeof(unsigned int));
+ *numtets = tg.out_tottets;
+ //*tets = (unsigned int *)MEM_malloc_arrayN(tg.out_tottets*4, sizeof(unsigned int), "remesh_output_tets");
+ *tets = (unsigned int *)malloc(tg.out_tottets*4*sizeof(unsigned int));
+ memcpy(*tets,tg.out_tets,tg.out_tottets*4*sizeof(unsigned int));
} // end success
@@ -352,11 +368,12 @@ static Mesh *BKE_mesh_remesh_tetgen(Mesh *input_mesh)
}
#endif
-struct Mesh *BKE_mesh_remesh_tetgen_to_mesh_nomain(struct Mesh *mesh)
+struct Mesh *BKE_mesh_remesh_tetgen_to_mesh_nomain(struct Mesh *mesh,
+ unsigned int **tets,
+ int *numtets)
{
#ifdef WITH_TETGEN
- Mesh *new_mesh = BKE_mesh_remesh_tetgen(mesh);
- return new_mesh;
+ return BKE_mesh_remesh_tetgen(mesh,tets,numtets);
#else
UNUSED_VARS(mesh,
tets,
diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c
index 90ef6519e33..a14cb41a4af 100644
--- a/source/blender/blenkernel/intern/softbody.c
+++ b/source/blender/blenkernel/intern/softbody.c
@@ -81,7 +81,6 @@
#include "PIL_time.h"
-
static CLG_LogRef LOG = {"bke.softbody"};
/* callbacks for errors and interrupts and some goo */
@@ -843,6 +842,11 @@ static void renew_softbody(Scene *scene, Object *ob, int totpoint, int totspring
sb = ob->soft;
softflag = ob->softflag;
+ if (sb->admmpd == NULL)
+ {
+ sb->admmpd = MEM_callocN(sizeof(ADMMPDInterfaceData), "SoftBody_ADMMPD");
+ }
+
if (totpoint) {
sb->totpoint = totpoint;
sb->totspring = totspring;
@@ -852,6 +856,13 @@ static void renew_softbody(Scene *scene, Object *ob, int totpoint, int totspring
sb->bspring = MEM_mallocN(totspring * sizeof(BodySpring), "bodyspring");
}
+ if (ob->type == OB_MESH)
+ {
+ const Mesh *me = ob->data;
+ int totfaces = poly_to_tri_count(me->totpoly, me->totloop);
+ admmpd_alloc(sb->admmpd, totpoint, totfaces);
+ }
+
/* initialize BodyPoint array */
for (i = 0; i < totpoint; i++) {
BodyPoint *bp = &sb->bpoint[i];
@@ -944,9 +955,10 @@ static void free_softbody_intern(SoftBody *sb)
sb->bpoint = NULL;
sb->bspring = NULL;
- if (sb->admmpd_data) {
- admmpd_cleanup(sb->admmpd_data);
- sb->admmpd_data = NULL;
+ if (sb->admmpd) {
+ admmpd_dealloc(sb->admmpd);
+ MEM_freeN(sb->admmpd);
+ sb->admmpd = NULL;
}
free_scratch(sb);
@@ -3121,7 +3133,6 @@ static void sb_new_scratch(SoftBody *sb)
SoftBody *sbNew(Scene *scene)
{
SoftBody *sb;
-
sb = MEM_callocN(sizeof(SoftBody), "softbody");
sb->mediafrict = 0.5f;
@@ -3168,9 +3179,7 @@ SoftBody *sbNew(Scene *scene)
sb->effector_weights = BKE_effector_add_weights(NULL);
}
- // ADMMPD_Data created in sbObjectStep
- sb->admmpd_data = NULL;
-
+ sb->admmpd = NULL;
sb->last_frame = MINFRAME - 1;
return sb;
@@ -3537,6 +3546,110 @@ static void sbStoreLastFrame(struct Depsgraph *depsgraph, Object *object, float
}
/* simulates one step. framenr is in frames */
+void sbObjectStep_admmpd(struct Depsgraph *depsgraph,
+ Scene *scene,
+ Object *ob,
+ float cfra,
+ float (*vertexCos)[3],
+ int numVerts)
+{
+ if(ob->type != OB_MESH)
+ return;
+
+ Mesh *me = ob->data;
+ SoftBody *sb = ob->soft;
+ PointCache *cache = sb->shared->pointcache;
+ int framenr = (int)cfra;
+ int framedelta = framenr - cache->simframe;
+
+ PTCacheID pid;
+ BKE_ptcache_id_from_softbody(&pid, ob, sb);
+ float timescale;
+ int startframe, endframe; // start and end frame of the cache
+ BKE_ptcache_id_time(&pid, scene, framenr, &startframe, &endframe, &timescale);
+ framenr = framenr < endframe ? framenr : endframe; // min(framenr,endframe)
+
+ if (framenr < startframe)
+ {
+ BKE_ptcache_invalidate(cache);
+ return;
+ }
+
+ // Reset simulation
+ bool reset_sim =
+ sb->admmpd == NULL ||
+ sb->admmpd->in_totverts != numVerts ||
+ framenr == startframe;
+
+ if (reset_sim)
+ {
+ BKE_ptcache_invalidate(cache);
+
+ if (sb->admmpd == NULL)
+ sb->admmpd = MEM_callocN(sizeof(ADMMPDInterfaceData), "SoftBody_ADMMPD");
+
+ // Resize data
+ admmpd_dealloc(sb->admmpd);
+ int totfaces = poly_to_tri_count(me->totpoly, me->totloop);
+ admmpd_alloc(sb->admmpd, me->totvert, totfaces);
+
+ // Initialize input data
+ for (int i=0; i<me->totvert; ++i)
+ {
+ // Local to global coordinates
+ float vi[3];
+ vi[0] = vertexCos[i][0];
+ vi[1] = vertexCos[i][1];
+ vi[2] = vertexCos[i][2];
+ mul_m4_v3(ob->obmat, vi);
+ for (int j=0; j<3; ++j)
+ {
+ sb->admmpd->in_verts[i*3+j] = vi[j];
+ sb->admmpd->in_vel[i*3+j] = 0;
+ }
+ }
+ MLoopTri *looptri, *lt;
+ looptri = lt = MEM_mallocN(sizeof(*looptri)*totfaces, __func__);
+ BKE_mesh_recalc_looptri(me->mloop, me->mpoly, me->mvert, me->totloop, me->totpoly, looptri);
+ for (int i=0; i<totfaces; ++i, ++lt)
+ {
+ sb->admmpd->in_faces[i*3+0] = me->mloop[lt->tri[0]].v;
+ sb->admmpd->in_faces[i*3+1] = me->mloop[lt->tri[1]].v;
+ sb->admmpd->in_faces[i*3+2] = me->mloop[lt->tri[2]].v;
+ }
+ MEM_freeN(looptri);
+
+ // Initalize solver
+ admmpd_init(sb->admmpd);
+
+ } // end reset ADMMPD data
+
+ // Cache vertices at initializer
+ if (framenr == startframe)
+ {
+ BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
+ BKE_ptcache_validate(cache, framenr);
+ cache->flag &= ~PTCACHE_REDO_NEEDED;
+ sbStoreLastFrame(depsgraph, ob, framenr);
+ return;
+ }
+
+ // if on second frame, write cache for first frame
+// if (cache->simframe == startframe &&
+// (cache->flag & PTCACHE_OUTDATED || cache->last_exact == 0)) {
+// BKE_ptcache_write(&pid, startframe);
+// }
+
+ admmpd_solve(sb->admmpd);
+ admmpd_map_vertices(sb->admmpd,vertexCos,numVerts);
+
+// BKE_ptcache_validate(cache, framenr);
+// BKE_ptcache_write(&pid, framenr);
+ //sbStoreLastFrame(depsgraph, ob, framenr);
+
+} // end step object with ADMMPD
+
+/* simulates one step. framenr is in frames */
void sbObjectStep(struct Depsgraph *depsgraph,
Scene *scene,
Object *ob,
@@ -3544,6 +3657,9 @@ void sbObjectStep(struct Depsgraph *depsgraph,
float (*vertexCos)[3],
int numVerts)
{
+ sbObjectStep_admmpd(depsgraph,scene,ob,cfra,vertexCos,numVerts);
+ return;
+
SoftBody *sb = ob->soft;
PointCache *cache;
PTCacheID pid;
@@ -3596,12 +3712,6 @@ void sbObjectStep(struct Depsgraph *depsgraph,
softbody_update_positions(ob, sb, vertexCos, numVerts);
softbody_reset(ob, sb, vertexCos, numVerts);
-
- if (sb->admmpd_data)
- admmpd_cleanup(sb->admmpd_data);
-
- BodyPoint *bp = sb->bpoint;
- sb->admmpd_data = admmpd_init(bp, numVerts);
}
/* still no points? go away */
@@ -3614,10 +3724,6 @@ void sbObjectStep(struct Depsgraph *depsgraph,
/* first frame, no simulation to do, just set the positions */
softbody_update_positions(ob, sb, vertexCos, numVerts);
- // sb->bpoint is NULL here :/
- //if (sb->admmpd_data)
- // bodypoint_to_admmpd(sb->admmpd_data,bp,numVerts)
-
BKE_ptcache_validate(cache, framenr);
cache->flag &= ~PTCACHE_REDO_NEEDED;
@@ -3677,16 +3783,7 @@ void sbObjectStep(struct Depsgraph *depsgraph,
dtime = framedelta * timescale;
/* do simulation */
-// softbody_step(depsgraph, scene, ob, sb, dtime);
-
- {
- if (sb->admmpd_data)
- {
- admmpd_solve(sb->admmpd_data);
- BodyPoint *bp = sb->bpoint;
- admmpd_to_bodypoint(sb->admmpd_data,bp,numVerts);
- }
- }
+ softbody_step(depsgraph, scene, ob, sb, dtime);
softbody_to_object(ob, vertexCos, numVerts, 0);
diff --git a/source/blender/editors/object/object_remesh.c b/source/blender/editors/object/object_remesh.c
index 10e41ebe946..1b0d373633c 100644
--- a/source/blender/editors/object/object_remesh.c
+++ b/source/blender/editors/object/object_remesh.c
@@ -1188,7 +1188,12 @@ static int tetgen_remesh_exec(bContext *C, wmOperator *op)
Mesh *mesh = ob->data;
Mesh *new_mesh = NULL;
- new_mesh = BKE_mesh_remesh_tetgen_to_mesh_nomain(mesh);
+ unsigned int *tets;
+ int numtets;
+ new_mesh = BKE_mesh_remesh_tetgen_to_mesh_nomain(mesh,&tets,&numtets);
+ if (tets) {
+ MEM_freeN(tets);
+ }
if (!new_mesh) {
BKE_report(op->reports, RPT_ERROR, "TetGen remesher failed to create mesh");
diff --git a/source/blender/makesdna/DNA_object_force_types.h b/source/blender/makesdna/DNA_object_force_types.h
index 183681c500e..bf0d26ef1b6 100644
--- a/source/blender/makesdna/DNA_object_force_types.h
+++ b/source/blender/makesdna/DNA_object_force_types.h
@@ -304,7 +304,7 @@ typedef struct SoftBody_Shared {
struct ListBase ptcaches;
} SoftBody_Shared;
-typedef struct ADMMPD_Data ADMMPD_Data;
+typedef struct ADMMPDInterfaceData ADMMPDInterfaceData;
typedef struct SoftBody {
/* dynamic data */
int totpoint, totspring;
@@ -313,7 +313,7 @@ typedef struct SoftBody {
/** Not saved in file. */
struct BodySpring *bspring;
- struct ADMMPD_Data *admmpd_data;
+ struct ADMMPDInterfaceData *admmpd;
char _pad;
char msg_lock;