Commit: 6a2ea7eb4e5b934109edf8cf68d0439a66ecd92d
Author: Lukas Tönne
Date:   Fri Oct 31 20:29:51 2014 +0100
Branches: hair_immediate_fixes
https://developer.blender.org/rB6a2ea7eb4e5b934109edf8cf68d0439a66ecd92d

Reimplemented the voxel texture type for displaying hair continuum grids.

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

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 10f05fc..f2bd34e 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),
@@ -51,7 +54,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 BPH_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 95cbc4c..c024344 100644
--- a/source/blender/physics/intern/BPH_mass_spring.cpp
+++ b/source/blender/physics/intern/BPH_mass_spring.cpp
@@ -697,6 +697,29 @@ static void cloth_calc_volume_force(ClothModifierData 
*clmd)
 }
 #endif
 
+static void cloth_continuum_fill_grid(HairVertexGrid *grid, Cloth *cloth)
+{
+       Implicit_Data *data = cloth->implicit;
+       int numverts = cloth->numverts;
+       ClothVertex *vert;
+       int i;
+       
+       for (i = 0, vert = cloth->verts; i < numverts; i++, vert++) {
+               float x[3], v[3];
+               
+               if (vert->solver_index < 0) {
+                       copy_v3_v3(x, vert->x);
+                       copy_v3_v3(v, vert->v);
+               }
+               else {
+                       BPH_mass_spring_get_position(data, vert->solver_index, 
x);
+                       BPH_mass_spring_get_new_velocity(data, 
vert->solver_index, v);
+               }
+               BPH_hair_volume_add_vertex(grid, x, v);
+       }
+       BPH_hair_volume_normalize_vertex_grid(grid);
+}
+
 static void cloth_continuum_step(ClothModifierData *clmd)
 {
        ClothSimSettings *parms = clmd->sim_parms;
@@ -722,30 +745,14 @@ static void cloth_continuum_step(ClothModifierData *clmd)
        /* gather velocities & density */
        if (smoothfac > 0.0f || pressfac > 0.0f) {
                HairVertexGrid *vertex_grid = 
BPH_hair_volume_create_vertex_grid(clmd->sim_parms->voxel_res, gmin, gmax);
-               
-               vert = cloth->verts;
-               for (i = 0; i < numverts; i++, vert++) {
-                       float x[3], v[3];
-                       
-                       if (vert->solver_index < 0) {
-                               copy_v3_v3(x, vert->x);
-                               copy_v3_v3(v, vert->v);
-                       }
-                       else {
-                               BPH_mass_spring_get_position(data, 
vert->solver_index, x);
-                               BPH_mass_spring_get_new_velocity(data, 
vert->solver_index, v);
-                       }
-                       BPH_hair_volume_add_vertex(vertex_grid, x, v);
-               }
-               BPH_hair_volume_normalize_vertex_grid(vertex_grid);
+               cloth_continuum_fill_grid(vertex_grid, cloth);
                
 #if 0
                /* apply velocity filter */
                BPH_hair_volume_vertex_grid_filter_box(vertex_grid, 
clmd->sim_parms->voxel_filter_size);
 #endif
                
-               vert = cloth->verts;
-               for (i = 0; i < numverts; i++, vert++) {
+               for (i = 0, vert = cloth->verts; i < numverts; i++, vert++) {
                        float x[3], v[3], nv[3];
                        
                        if (vert->solver_index < 0)
@@ -980,3 +987,24 @@ int BPH_cloth_solve(Object *ob, float frame, 
ClothModifierData *clmd, ListBase *
        
        return 1;
 }
+
+bool BPH_cloth_solver_get_texture_data(Object *UNUSED(ob), ClothModifierData 
*clmd, VoxelData *vd)
+{
+       Cloth *cloth = clmd->clothObject;
+       HairVertexGrid *grid;
+       float gmin[3], gmax[3];
+       
+       if (!clmd->clothObject || !clmd->clothObject->implicit)
+               return false;
+       
+       hair_get_boundbox(clmd, gmin, gmax);
+       
+       grid = BPH_hair_volume_create_vertex_grid(clmd->sim_parms->voxel_res, 
gmin, gmax);
+       cloth_continuum_fill_grid(grid, cloth);
+       
+       BPH_hair_volume_get_texture_data(grid, vd);
+       
+       BPH_hair_volume_free_vertex_grid(grid);
+       
+       return true;
+}
diff --git a/source/blender/physics/intern/hair_volume.c 
b/source/blender/physics/intern/hair_volume.c
index b5c4188..988bf4b 100644
--- a/source/blender/physics/intern/hair_volume.c
+++ b/source/blender/physics/intern/hair_volume.c
@@ -34,6 +34,8 @@
 #include "BLI_math.h"
 #include "BLI_utildefines.h"
 
+#include "DNA_texture_types.h"
+
 #include "implicit.h"
 
 /* ================ Volumetric Hair Interaction ================
@@ -509,30 +511,16 @@ static HairGridVert 
*hair_volume_create_collision_grid(ClothModifierData *clmd,
 }
 #endif
 
-#if 0
-bool implicit_hair_volume_get_texture_data(Object *UNUSED(ob), 
ClothModifierData *clmd, ListBase *UNUSED(effectors), VoxelData *vd)
+bool BPH_hair_volume_get_texture_data(HairVertexGrid *grid, VoxelData *vd)
 {
-       lfVector *lX, *lV;
-       HairGridVert *hairgrid/*, *collgrid*/;
-       int numverts;
        int totres, i;
        int depth;
 
-       if (!clmd->clothObject || !clmd->clothObject->implicit)
-               return false;
-
-       lX = clmd->clothObject->implicit->X;
-       lV = clmd->clothObject->implicit->V;
-       numverts = clmd->clothObject->numverts;
-
-       hairgrid = hair_volume_create_hair_grid(clmd, lX, lV, numverts);
-//     collgrid = hair_volume_create_collision_grid(clmd, lX, numverts);
-
-       vd->resol[0] = hair_grid_res;
-       vd->resol[1] = hair_grid_res;
-       vd->resol[2] = hair_grid_res;
+       vd->resol[0] = grid->res;
+       vd->resol[1] = grid->res;
+       vd->resol[2] = grid->res;
        
-       totres = hair_grid_size(hair_grid_res);
+       totres = hair_grid_size(grid->res);
        
        if (vd->hair_type == TEX_VD_HAIRVELOCITY) {
                depth = 4;
@@ -549,20 +537,21 @@ bool implicit_hair_volume_get_texture_data(Object 
*UNUSED(ob), ClothModifierData
                for (i = 0; i < totres; ++i) {
                        switch (vd->hair_type) {
                                case TEX_VD_HAIRDENSITY:
-                                       vd->dataset[i] = hairgrid[i].density;
+                                       vd->dataset[i] = grid->verts[i].density;
                                        break;
                                
                                case TEX_VD_HAIRRESTDENSITY:
                                        vd->dataset[i] = 0.0f; // TODO
                                        break;
                                
-                               case TEX_VD_HAIRVELOCITY:
-                                       vd->dataset[i + 0*totres] = 
hairgrid[i].velocity[0];
-                                       vd->dataset[i + 1*totres] = 
hairgrid[i].velocity[1];
-                                       vd->dataset[i + 2*totres] = 
hairgrid[i].velocity[2];
-                                       vd->dataset[i + 3*totres] = 
len_v3(hairgrid[i].velocity);
+                               case TEX_VD_HAIRVELOCITY: {
+                                       float tmp = grid->verts[i].velocity[1];
+                                       vd->dataset[i + 0*totres] = 
grid->verts[i].velocity[0];
+                                       vd->dataset[i + 1*totres] = 
grid->verts[i].velocity[1];
+                                       vd->dataset[i + 2*totres] = 
grid->verts[i].velocity[2];
+                                       vd->dataset[i + 3*totres] = 
len_v3(grid->verts[i].velocity);
                                        break;
-                               
+                               }
                                case TEX_VD_HAIRENERGY:
                                        vd->dataset[i] = 0.0f; // TODO
                                        break;
@@ -573,10 +562,5 @@ bool implicit_hair_volume_get_texture_data(Object 
*UNUSED(ob), ClothModifierData
                vd->dataset = NULL;
        }
        
-       MEM_freeN(hairgrid);
-//     MEM_freeN(collgrid);
-       
        return true;
 }
-
-#endif
diff --git a/source/blender/physics/intern/implicit.h 
b/source/blender/physics/intern/implicit.h
index 9ec7e76..b7eeea1 100644
--- a/source/blender/physics/intern/implicit.h
+++ b/source/blender/physics/intern/implicit.h
@@ -168,6 +168,9 @@ bool BPH_mass_spring_force_spring_goal(struct Implicit_Data 
*data, int i, const
 struct HairVertexGrid;
 struct HairColliderGrid;
 
+struct Object;
+struct VoxelData;
+
 struct HairVertexGrid *BPH_hair_volume_create_vertex_grid(int res, const float 
gmin[3], const float gmax[3]);
 void BPH_hair_volume_free_vertex_grid(struct HairVertexGrid *grid);
 void BPH_hair_volume_grid_geometry(struct HairVertexGrid *grid, float 
cellsize[3], int res[3], float gmin[3], float gmax[3]);
@@ -195,6 +198,8 @@ void BPH_hair_volume_vertex_grid_forces(struct 
HairVertexGrid *grid, const float
                                         float smoothfac, float pressurefac, 
float minpressure,
                                         float f[3], float dfdx[3][3], float 
dfdv[3][3]);
 
+bool BPH_hair_volume_get_texture_data(struct HairVertexGrid *grid, struct 
VoxelData *vd);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/render/CMakeLists.txt 
b/source/blender/render/CMakeLists.txt
index e516c95..36b9f8a 100644
--- a/source/blender/render/CMakeLists.txt
+++ b/source/blender/render/CMakeLists.txt
@@ -33,6 +33,7 @@ set(INC
        ../imbuf
        ../makesdna
        ../makesrna
+       ../physics
        ../../../intern/guardedalloc
        ../../../intern/mikktspace
        ../../../intern/smoke/extern
diff --git a/source/blender/render/SConscript b/source/blender/render/SConscript
index 7f45944..b8cdd70 100644
--- a/source/blender/render/SConscript
+++ b/source/blender/render/SConscript
@@ -41,6 +41,7 @@ incs = [
     '../include',
     '../makesdna',
     '../makesrna',
+    '../physics',
     '../../../intern/mikktspace',
     '../../../intern/smoke/extern',
     ]
diff --git a/source/blender/render/intern/source/voxeldata.c 
b/source/blender/render/intern/source/voxeldata.c
index a6feea9..036743a 100644
--- a/source/blender/render/intern/source/voxeldata.c
+++ b/source/blender/render/intern/source/voxeldata.c
@@ -58,6 +58,7 @@
 #include "BKE_modifier.h"
 
 #include "smoke_API.h"
+#include "BPH_mass_spring.h"
 
 #include "DNA_texture_types.h"
 #include "DNA_object_force.h"
@@ -381,8 +382,7 @@ static void init_frame_hair(VoxelData *vd, int UNUSED(cfra))
                ParticleSystemModifierData *pmd = (ParticleSystemModifierData 
*)md;
                
                if (pmd->psys && pmd->psys->clmd) {
-                       // XXX TODO was moved into own subfolder, figure out 
how to handle this (perhaps make a wrapper in BKE)
-//                     found |= implicit_hair_volume_get_texture_data(ob, 
pmd->psys->clmd, NULL, vd);
+                       found |= BPH_cloth_solver_get_texture_data(ob, 
pmd->psys->clmd, vd);
                }
        }

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

Reply via email to