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