Commit: a5bdc8a105144adba9550380edf5c2ed3dcd9d7c
Author: Lukas Tönne
Date:   Sun Aug 24 18:54:18 2014 +0200
Branches: hair_system
https://developer.blender.org/rBa5bdc8a105144adba9550380edf5c2ed3dcd9d7c

Voxel texture mode "Hair" for displaying hair volume data.

Currently only a dummy attribute "randomstuff" exists, this will be
replaced by actual hair data (density and filtered velocities).

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

M       source/blender/hair/HAIR_capi.cpp
M       source/blender/hair/HAIR_capi.h
M       source/blender/hair/HAIR_debug_types.h
M       source/blender/hair/intern/HAIR_debug.cpp
M       source/blender/hair/intern/HAIR_debug.h
M       source/blender/hair/intern/HAIR_volume.cpp
M       source/blender/makesdna/DNA_texture_types.h
M       source/blender/makesrna/intern/rna_texture.c
M       source/blender/render/CMakeLists.txt
M       source/blender/render/intern/source/voxeldata.c

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

diff --git a/source/blender/hair/HAIR_capi.cpp 
b/source/blender/hair/HAIR_capi.cpp
index 0c8c222..1346e7c 100644
--- a/source/blender/hair/HAIR_capi.cpp
+++ b/source/blender/hair/HAIR_capi.cpp
@@ -288,3 +288,9 @@ void HAIR_solver_get_derived_verts(struct HAIR_Solver 
*csolver, ParticleSystem *
        Solver *solver = (Solver *)csolver;
        SceneConverter::apply_solver_data(solver->data(), psys, ob, vertCoords);
 }
+
+bool HAIR_debug_texture_volume(HAIR_Solver *csolver, struct VoxelData *vd)
+{
+       Solver *solver = (Solver *)csolver;
+       return Debug::texture_volume(&solver->volume(), vd);
+}
diff --git a/source/blender/hair/HAIR_capi.h b/source/blender/hair/HAIR_capi.h
index d928b8f..c22a59b 100644
--- a/source/blender/hair/HAIR_capi.h
+++ b/source/blender/hair/HAIR_capi.h
@@ -39,6 +39,7 @@ struct HairSystem;
 struct HairParams;
 struct HairDebugData;
 struct rbDynamicsWorld;
+struct VoxelData;
 
 struct ParticleSystem;
 
@@ -83,6 +84,8 @@ int HAIR_frame_iter_index(struct HAIR_FrameIterator *citer);
 void HAIR_frame_iter_get(struct HAIR_FrameIterator *iter, float nor[3], float 
tan[3], float cotan[3]);
 void HAIR_frame_iter_next(struct HAIR_FrameIterator *iter);
 
+bool HAIR_debug_texture_volume(struct HAIR_Solver *solver, struct VoxelData 
*vd);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/hair/HAIR_debug_types.h 
b/source/blender/hair/HAIR_debug_types.h
index 787328b..e89cfda 100644
--- a/source/blender/hair/HAIR_debug_types.h
+++ b/source/blender/hair/HAIR_debug_types.h
@@ -53,12 +53,6 @@ typedef struct HAIR_SolverDebugVoxel {
        float r;
 } HAIR_SolverDebugVoxel;
 
-typedef struct HAIR_SolverDebugVolume {
-       HAIR_SolverDebugVoxel *data;
-       int size_x, size_y, size_z;
-       float dimensions[3];
-} HAIR_SolverDebugVolume;
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/hair/intern/HAIR_debug.cpp 
b/source/blender/hair/intern/HAIR_debug.cpp
index ff7e345..2b70eca 100644
--- a/source/blender/hair/intern/HAIR_debug.cpp
+++ b/source/blender/hair/intern/HAIR_debug.cpp
@@ -26,6 +26,10 @@
 
 #include <cstring>
 
+extern "C" {
+#include "DNA_texture_types.h"
+}
+
 #include "HAIR_debug.h"
 #include "HAIR_volume.h"
 
@@ -37,21 +41,24 @@ ThreadMutex Debug::mutex;
 Debug::Elements Debug::elements;
 #endif
 
-HAIR_SolverDebugVolume *Debug::volume(Volume *vol)
+bool Debug::texture_volume(Volume *vol, VoxelData *vd)
 {
-       HAIR_SolverDebugVolume *dvol = (HAIR_SolverDebugVolume 
*)MEM_callocN(sizeof(HAIR_SolverDebugVolume), "hair debug volume");
-       
-       dvol->size_x = vol->size_x();
-       dvol->size_y = vol->size_y();
-       dvol->size_z = vol->size_z();
+       vd->resol[0] = vol->size_x();
+       vd->resol[1] = vol->size_y();
+       vd->resol[2] = vol->size_z();
        
-       dvol->dimensions[0] = dvol->dimensions[1] = dvol->dimensions[2] = 10.0f;
-       
-       int totsize = vol->size_x() * vol->size_y() * vol->size_z();
-       dvol->data = (HAIR_SolverDebugVoxel 
*)MEM_mallocN(sizeof(HAIR_SolverDebugVoxel) * totsize, "hair debug voxel data");
-       for (int i = 0; i < totsize; ++i) {
-               dvol->data[i].r = vol->randomstuff.data()[i];
+       size_t totres = (size_t)vol->size_x() * (size_t)vol->size_y() * 
(size_t)vol->size_z();
+       vd->data_type = TEX_VD_INTENSITY;
+       if (totres > 0) {
+               vd->dataset = (float *)MEM_mapallocN(sizeof(float) * (totres), 
"hair volume texture data");
+               for (int i = 0; i < totres; ++i) {
+                       vd->dataset[i] = vol->randomstuff.data()[i];
+               }
        }
+       else
+               vd->dataset = NULL;
+       
+       return true;
 }
 
 HAIR_NAMESPACE_END
diff --git a/source/blender/hair/intern/HAIR_debug.h 
b/source/blender/hair/intern/HAIR_debug.h
index 1bc39e3..383fc4d 100644
--- a/source/blender/hair/intern/HAIR_debug.h
+++ b/source/blender/hair/intern/HAIR_debug.h
@@ -38,6 +38,8 @@ extern "C" {
 #include "HAIR_smoothing.h"
 #include "HAIR_types.h"
 
+struct VoxelData;
+
 HAIR_NAMESPACE_BEGIN
 
 #ifndef NDEBUG
@@ -147,7 +149,7 @@ struct Debug {
 #endif
        }
        
-       static HAIR_SolverDebugVolume *volume(Volume *vol);
+       static bool texture_volume(Volume *vol, VoxelData *vd);
        
        static bool active;
 #ifdef HAIR_DEBUG
diff --git a/source/blender/hair/intern/HAIR_volume.cpp 
b/source/blender/hair/intern/HAIR_volume.cpp
index dcf8974..10e3ecc 100644
--- a/source/blender/hair/intern/HAIR_volume.cpp
+++ b/source/blender/hair/intern/HAIR_volume.cpp
@@ -28,12 +28,18 @@
 
 HAIR_NAMESPACE_BEGIN
 
-Volume::Volume()
+Volume::Volume() :
+    m_size_x(0),
+    m_size_y(0),
+    m_size_z(0)
 {
 }
 
 void Volume::resize(int x, int y, int z)
 {
+       m_size_x = x;
+       m_size_y = y;
+       m_size_z = z;
        int totsize = x * y * z;
        
        randomstuff.resize(totsize);
diff --git a/source/blender/makesdna/DNA_texture_types.h 
b/source/blender/makesdna/DNA_texture_types.h
index d256cfb..653cca8 100644
--- a/source/blender/makesdna/DNA_texture_types.h
+++ b/source/blender/makesdna/DNA_texture_types.h
@@ -612,6 +612,7 @@ enum {
 #define TEX_VD_RAW_16BIT               2
 #define TEX_VD_IMAGE_SEQUENCE  3
 #define TEX_VD_SMOKE                   4
+#define TEX_VD_HAIR                            5
 /* for voxels which use VoxelData->source_path */
 #define TEX_VD_IS_SOURCE_PATH(_format) (ELEM(_format, TEX_VD_BLENDERVOXEL, 
TEX_VD_RAW_8BIT, TEX_VD_RAW_16BIT))
 
diff --git a/source/blender/makesrna/intern/rna_texture.c 
b/source/blender/makesrna/intern/rna_texture.c
index f098a65..cf57f0a 100644
--- a/source/blender/makesrna/intern/rna_texture.c
+++ b/source/blender/makesrna/intern/rna_texture.c
@@ -1848,6 +1848,7 @@ static void rna_def_texture_voxeldata(BlenderRNA *brna)
                {TEX_VD_IMAGE_SEQUENCE, "IMAGE_SEQUENCE", 0, "Image Sequence",
                                        "Generate voxels from a sequence of 
image slices"},
                {TEX_VD_SMOKE, "SMOKE", 0, "Smoke", "Render voxels from a 
Blender smoke simulation"},
+               {TEX_VD_HAIR, "HAIR", 0, "Hair", "Render voxels from a Blender 
hair simulation"},
                {0, NULL, 0, NULL, NULL}
        };
        
diff --git a/source/blender/render/CMakeLists.txt 
b/source/blender/render/CMakeLists.txt
index 8e326e7..654fd83 100644
--- a/source/blender/render/CMakeLists.txt
+++ b/source/blender/render/CMakeLists.txt
@@ -30,6 +30,7 @@ set(INC
        ../blenfont
        ../blenkernel
        ../blenlib
+       ../hair
        ../imbuf
        ../makesdna
        ../makesrna
diff --git a/source/blender/render/intern/source/voxeldata.c 
b/source/blender/render/intern/source/voxeldata.c
index 50b5e39..46c90ce 100644
--- a/source/blender/render/intern/source/voxeldata.c
+++ b/source/blender/render/intern/source/voxeldata.c
@@ -52,11 +52,14 @@
 #include "IMB_imbuf_types.h"
 
 #include "BKE_global.h"
+#include "BKE_hair.h"
 #include "BKE_image.h"
 #include "BKE_main.h"
 #include "BKE_modifier.h"
 
 #include "smoke_API.h"
+#include "HAIR_capi.h"
+#include "HAIR_debug_types.h"
 
 #include "DNA_texture_types.h"
 #include "DNA_object_force.h"
@@ -365,6 +368,26 @@ static void init_frame_smoke(VoxelData *vd, int cfra)
 #endif
 }
 
+static void init_frame_hair(VoxelData *vd, int cfra)
+{
+       Object *ob;
+       ModifierData *md;
+       
+       vd->dataset = NULL;
+       if (vd->object == NULL) return;
+       ob = vd->object;
+       
+       if ((md = (ModifierData *)modifiers_findByType(ob, 
eModifierType_Hair))) {
+               HairModifierData *hmd = (HairModifierData *)md;
+               
+               if (hmd->solver) {
+                       HAIR_debug_texture_volume(hmd->solver, vd);
+               }
+       }
+       
+       vd->ok = 1;
+}
+
 void cache_voxeldata(Tex *tex, int scene_frame)
 {      
        VoxelData *vd = tex->vd;
@@ -398,6 +421,9 @@ void cache_voxeldata(Tex *tex, int scene_frame)
                case TEX_VD_SMOKE:
                        init_frame_smoke(vd, scene_frame);
                        return;
+               case TEX_VD_HAIR:
+                       init_frame_hair(vd, scene_frame);
+                       return;
                case TEX_VD_BLENDERVOXEL:
                        BLI_path_abs(path, G.main->name);
                        if (!BLI_exists(path)) return;

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

Reply via email to