Commit: d42525a9b5493b758d0f19423bafc43cd335955b
Author: Lukas Tönne
Date:   Fri Oct 31 20:29:51 2014 +0100
Branches: master
https://developer.blender.org/rBd42525a9b5493b758d0f19423bafc43cd335955b

Reimplemented the voxel texture type for displaying hair continuum grids.

Conflicts:
        source/blender/physics/intern/BPH_mass_spring.cpp

===================================================================

M       source/blender/physics/BPH_mass_spring.h
M       source/blender/physics/intern/BPH_mass_spring.cpp
M       source/blender/physics/intern/hair_volume.c
M       source/blender/physics/intern/implicit.h
M       source/blender/render/CMakeLists.txt
M       source/blender/render/SConscript
M       source/blender/render/intern/source/voxeldata.c

===================================================================

diff --git a/source/blender/physics/BPH_mass_spring.h 
b/source/blender/physics/BPH_mass_spring.h
index 166d040..c189dea 100644
--- a/source/blender/physics/BPH_mass_spring.h
+++ b/source/blender/physics/BPH_mass_spring.h
@@ -33,7 +33,10 @@ extern "C" {
 #endif
 
 struct Implicit_Data;
+struct Object;
 struct ClothModifierData;
+struct ListBase;
+struct VoxelData;
 
 typedef enum eMassSpringSolverStatus {
        BPH_SOLVER_SUCCESS              = (1 << 0),
@@ -50,7 +53,7 @@ void BPH_cloth_solver_free(struct ClothModifierData *clmd);
 int BPH_cloth_solve(struct Object *ob, float frame, struct ClothModifierData 
*clmd, struct ListBase *effectors);
 void BKE_cloth_solver_set_positions(struct ClothModifierData *clmd);
 
-bool implicit_hair_volume_get_texture_data(struct Object *UNUSED(ob), struct 
ClothModifierData *clmd, struct ListBase *UNUSED(effectors), struct VoxelData 
*vd);
+bool BPH_cloth_solver_get_texture_data(struct Object *ob, struct 
ClothModifierData *clmd, struct VoxelData *vd);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/physics/intern/BPH_mass_spring.cpp 
b/source/blender/physics/intern/BPH_mass_spring.cpp
index a894603..7a2d85f 100644
--- a/source/blender/physics/intern/BPH_mass_spring.cpp
+++ b/source/blender/physics/intern/BPH_mass_spring.cpp
@@ -1,844 +1,871 @@
-/*
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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.
- *
- * The Original Code is Copyright (C) Blender Foundation
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): Lukas Toenne
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/blenkernel/intern/BPH_mass_spring.c
- *  \ingroup bph
- */
-
-extern "C" {
-#include "MEM_guardedalloc.h"
-
-#include "DNA_cloth_types.h"
-#include "DNA_scene_types.h"
-#include "DNA_object_force.h"
-#include "DNA_object_types.h"
-#include "DNA_meshdata_types.h"
-#include "DNA_modifier_types.h"
-
-#include "BLI_math.h"
-#include "BLI_linklist.h"
-#include "BLI_utildefines.h"
-
-#include "BKE_cloth.h"
-#include "BKE_collision.h"
-#include "BKE_effect.h"
-}
-
-#include "BPH_mass_spring.h"
-#include "implicit.h"
-
-/* Number of off-diagonal non-zero matrix blocks.
- * Basically there is one of these for each vertex-vertex interaction.
- */
-static int cloth_count_nondiag_blocks(Cloth *cloth)
-{
-       LinkNode *link;
-       int nondiag = 0;
-       
-       for (link = cloth->springs; link; link = link->next) {
-               ClothSpring *spring = (ClothSpring *)link->link;
-               switch (spring->type) {
-                       case CLOTH_SPRING_TYPE_BENDING_ANG:
-                               /* angular bending combines 3 vertices */
-                               nondiag += 3;
-                               break;
-                               
-                       default:
-                               /* all other springs depend on 2 vertices only 
*/
-                               nondiag += 1;
-                               break;
-               }
-       }
-       
-       return nondiag;
-}
-
-int BPH_cloth_solver_init(Object *UNUSED(ob), ClothModifierData *clmd)
-{
-       Cloth *cloth = clmd->clothObject;
-       ClothVertex *verts = cloth->verts;
-       const float ZERO[3] = {0.0f, 0.0f, 0.0f};
-       Implicit_Data *id;
-       unsigned int i, nondiag;
-       
-       nondiag = cloth_count_nondiag_blocks(cloth);
-       cloth->implicit = id = BPH_mass_spring_solver_create(cloth->numverts, 
nondiag);
-       
-       for (i = 0; i < cloth->numverts; i++) {
-               BPH_mass_spring_set_vertex_mass(id, i, verts[i].mass);
-       }
-       
-       for (i = 0; i < cloth->numverts; i++) {
-               BPH_mass_spring_set_motion_state(id, i, verts[i].x, ZERO);
-       }
-       
-       return 1;
-}
-
-void BPH_cloth_solver_free(ClothModifierData *clmd)
-{
-       Cloth *cloth = clmd->clothObject;
-       
-       if (cloth->implicit) {
-               BPH_mass_spring_solver_free(cloth->implicit);
-               cloth->implicit = NULL;
-       }
-}
-
-void BKE_cloth_solver_set_positions(ClothModifierData *clmd)
-{
-       Cloth *cloth = clmd->clothObject;
-       ClothVertex *verts = cloth->verts;
-       unsigned int numverts = cloth->numverts, i;
-       ClothHairRoot *cloth_roots = clmd->roots;
-       Implicit_Data *id = cloth->implicit;
-       
-       for (i = 0; i < numverts; i++) {
-               ClothHairRoot *root = &cloth_roots[i];
-               
-               BPH_mass_spring_set_rest_transform(id, i, root->rot);
-               BPH_mass_spring_set_motion_state(id, i, verts[i].x, verts[i].v);
-       }
-}
-
-static bool collision_response(ClothModifierData *clmd, CollisionModifierData 
*collmd, CollPair *collpair, float dt, float restitution, float r_impulse[3])
-{
-       Cloth *cloth = clmd->clothObject;
-       int index = collpair->ap1;
-       bool result = false;
-       
-       float v1[3], v2_old[3], v2_new[3], v_rel_old[3], v_rel_new[3];
-       float epsilon2 = BLI_bvhtree_getepsilon(collmd->bvhtree);
-
-       float margin_distance = collpair->distance - epsilon2;
-       float mag_v_rel;
-       
-       zero_v3(r_impulse);
-       
-       if (margin_distance > 0.0f)
-               return false; /* XXX tested before already? */
-       
-       /* only handle static collisions here */
-       if ( collpair->flag & COLLISION_IN_FUTURE )
-               return false;
-       
-       /* velocity */
-       copy_v3_v3(v1, cloth->verts[index].v);
-       collision_get_collider_velocity(v2_old, v2_new, collmd, collpair);
-       /* relative velocity = velocity of the cloth point relative to the 
collider */
-       sub_v3_v3v3(v_rel_old, v1, v2_old);
-       sub_v3_v3v3(v_rel_new, v1, v2_new);
-       /* normal component of the relative velocity */
-       mag_v_rel = dot_v3v3(v_rel_old, collpair->normal);
-       
-       /* only valid when moving toward the collider */
-       if (mag_v_rel < -ALMOST_ZERO) {
-               float v_nor_old, v_nor_new;
-               float v_tan_old[3], v_tan_new[3];
-               float bounce, repulse;
-               
-               /* Collision response based on
-                * "Simulating Complex Hair with Robust Collision Handling" 
(Choe, Choi, Ko, ACM SIGGRAPH 2005)
-                * 
http://graphics.snu.ac.kr/publications/2005-choe-HairSim/Choe_2005_SCA.pdf
-                */
-               
-               v_nor_old = mag_v_rel;
-               v_nor_new = dot_v3v3(v_rel_new, collpair->normal);
-               
-               madd_v3_v3v3fl(v_tan_old, v_rel_old, collpair->normal, 
-v_nor_old);
-               madd_v3_v3v3fl(v_tan_new, v_rel_new, collpair->normal, 
-v_nor_new);
-               
-               bounce = -v_nor_old * restitution;
-               
-               repulse = -margin_distance / dt; /* base repulsion velocity in 
normal direction */
-               /* XXX this clamping factor is quite arbitrary ...
-                * not sure if there is a more scientific approach, but seems 
to give good results
-                */
-               CLAMP(repulse, 0.0f, 4.0f * bounce);
-               
-               if (margin_distance < -epsilon2) {
-                       mul_v3_v3fl(r_impulse, collpair->normal, 
max_ff(repulse, bounce) - v_nor_new);
-               }
-               else {
-                       bounce = 0.0f;
-                       mul_v3_v3fl(r_impulse, collpair->normal, repulse - 
v_nor_new);
-               }
-               
-               result = true;
-       }
-       
-       return result;
-}
-
-/* Init constraint matrix
- * This is part of the modified CG method suggested by Baraff/Witkin in
- * "Large Steps in Cloth Simulation" (Siggraph 1998)
- */
-static void cloth_setup_constraints(ClothModifierData *clmd, ColliderContacts 
*contacts, int totcolliders, float dt)
-{
-       Cloth *cloth = clmd->clothObject;
-       Implicit_Data *data = cloth->implicit;
-       ClothVertex *verts = cloth->verts;
-       int numverts = cloth->numverts;
-       int i, j, v;
-       
-       const float ZERO[3] = {0.0f, 0.0f, 0.0f};
-       
-       for (v = 0; v < numverts; v++) {
-               if (verts[v].flags & CLOTH_VERT_FLAG_PINNED) {
-                       /* pinned vertex constraints */
-                       BPH_mass_spring_add_constraint_ndof0(data, v, ZERO); /* 
velocity is defined externally */
-               }
-               
-               verts[v].impulse_count = 0;
-       }
-
-       for (i = 0; i < totcolliders; ++i) {
-               ColliderContacts *ct = &contacts[i];
-               for (j = 0; j < ct->totcollisions; ++j) {
-                       CollPair *collpair = &ct->collisions[j];
-//                     float restitution = (1.0f - clmd->coll_parms->damping) 
* (1.0f - ct->ob->pd->pdef_sbdamp);
-                       float restitution = 0.0f;
-                       int v = collpair->face1;
-                       float impulse[3];
-                       
-                       /* pinned verts handled separately */
-                       if (verts[v].flags & CLOTH_VERT_FLAG_PINNED)
-                               continue;
-                       
-                       /* XXX cheap way of avoiding instability from multiple 
collisions in the same step
-                        * this should eventually be supported ...
-                        */
-                       if (verts[v].impulse_count > 0)
-                               continue;
-                       
-                       /* calculate collision response */
-                       if (!collision_response(clmd, ct->collmd, collpair, dt, 
restitution, impulse))
-                               continue;
-                       
-                       BPH_mass_spring_add_constraint_ndof2(data, v, 
collpair->normal, impulse);
-                       ++verts[v].impulse_count;
-                       
-                       BKE_sim_debug_data_add_dot(clmd->debug_data, 
collpair->pa, 0, 1, 0, "collision", hash_collpair(936, collpair));
-//                     BKE_sim_debug_data_add_dot(clmd->debug_data, 
collpair->pb, 1, 0, 0, "collision", hash_collpair(937, collpair));
-//                     BKE_sim_debug_data_add_line(clmd->debug_data, 
collpair->pa, collpair->pb, 0.7, 0.7, 0.7, "collision", hash_collpair(938, 
collpair));
-                       
-                       { /* DEBUG */
-                               float nor[3];
-                               mul_v3_v3fl(nor, collpair->normal, 
-collpair->distance);
-                               BKE_sim_debug_data_add_vector(clmd->debug_data, 
collpair->pa, nor, 1, 1, 0, "collision", hash_collpair(939, collpair));
-//                             BKE_sim_debug_data_add_vector(clmd->debug_data, 
collpair->pb, impulse, 1, 1, 0, "collision", hash_collpair(940, collpair));
-//                             BKE_sim_debug_data_add_vector(clmd->debug_data, 
collpair->pb, collpair->normal, 1, 1, 0, "collision", hash_collpair(941, 
collpair));
-                       }
-               }
-       }
-}
-
-/* computes where the cloth would be if it were subject to perfectly stiff 
edges
- * (edge distance constraints) in a lagrangian solver.  then add forces to help
- * guide the implicit solver to that state.  this function is called after
- * collisions*/
-static int UNUSED_FUNCTION(cloth_calc_helper_forces)(Object *UNUSED(ob), 
ClothModifierData *clmd, float (*initial_cos)[3], float UNUSED(step), float dt)
-{
-       Cloth *cloth= clmd->clothObject;
-       float (*cos)[3] = (float 
(*)[3])MEM_callocN(sizeof(float)*3*cloth->numverts, "cos 
cloth_calc_helper_forces");
-       float *masses = (float *)MEM_callocN(sizeof(float)*cloth->numverts

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to