[Bf-blender-cvs] [41e8470] testbuild: Hair System test
Lukas Tönne
noreply at git.blender.org
Fri Aug 15 17:48:32 CEST 2014
Commit: 41e84700c35a602385d97bcc3e2d45031c99573f
Author: Lukas Tönne
Date: Fri Aug 15 17:48:28 2014 +0200
Branches: testbuild
https://developer.blender.org/rB41e84700c35a602385d97bcc3e2d45031c99573f
Hair System test
===================================================================
M build_files/cmake/macros.cmake
M intern/cycles/blender/addon/ui.py
M intern/cycles/blender/blender_curves.cpp
M intern/cycles/blender/blender_sync.h
M intern/rigidbody/CMakeLists.txt
M intern/rigidbody/RBI_api.h
M intern/rigidbody/rb_bullet_api.cpp
A intern/rigidbody/rb_internal_types.h
M release/scripts/startup/bl_ui/__init__.py
M release/scripts/startup/bl_ui/properties_data_modifier.py
M release/scripts/startup/bl_ui/properties_physics_common.py
A release/scripts/startup/bl_ui/properties_physics_hair.py
M source/blender/CMakeLists.txt
M source/blender/SConscript
A source/blender/blenkernel/BKE_hair.h
A source/blender/blenkernel/BKE_mesh_sample.h
M source/blender/blenkernel/BKE_object.h
M source/blender/blenkernel/BKE_particle.h
M source/blender/blenkernel/BKE_rigidbody.h
M source/blender/blenkernel/CMakeLists.txt
M source/blender/blenkernel/SConscript
A source/blender/blenkernel/intern/hair.c
A source/blender/blenkernel/intern/mesh_sample.c
M source/blender/blenkernel/intern/object.c
M source/blender/blenkernel/intern/particle.c
M source/blender/blenkernel/intern/rigidbody.c
A source/blender/blenkernel/intern/rigidbody_objects.c
M source/blender/blenkernel/intern/scene.c
M source/blender/blenloader/intern/readfile.c
M source/blender/blenloader/intern/writefile.c
M source/blender/editors/physics/CMakeLists.txt
M source/blender/editors/physics/SConscript
A source/blender/editors/physics/hair_ops.c
M source/blender/editors/physics/physics_intern.h
M source/blender/editors/physics/physics_ops.c
M source/blender/editors/space_buttons/buttons_context.c
M source/blender/editors/space_view3d/CMakeLists.txt
M source/blender/editors/space_view3d/SConscript
A source/blender/editors/space_view3d/drawhair.c
M source/blender/editors/space_view3d/drawobject.c
M source/blender/editors/space_view3d/view3d_intern.h
M source/blender/editors/transform/transform_conversions.c
A source/blender/hair/CMakeLists.txt
A source/blender/hair/HAIR_capi.cpp
A source/blender/hair/HAIR_capi.h
A source/blender/hair/SConscript
A source/blender/hair/intern/HAIR_collision.cpp
A source/blender/hair/intern/HAIR_curve.cpp
A source/blender/hair/intern/HAIR_curve.h
A source/blender/hair/intern/HAIR_debug.cpp
A source/blender/hair/intern/HAIR_debug.h
A source/blender/hair/intern/HAIR_math.cpp
A source/blender/hair/intern/HAIR_math.h
A source/blender/hair/intern/HAIR_memalloc.h
A source/blender/hair/intern/HAIR_scene.cpp
A source/blender/hair/intern/HAIR_scene.h
A source/blender/hair/intern/HAIR_smoothing.cpp
A source/blender/hair/intern/HAIR_smoothing.h
A source/blender/hair/intern/HAIR_solver.cpp
A source/blender/hair/intern/HAIR_solver.h
A source/blender/hair/intern/HAIR_types.cpp
A source/blender/hair/intern/HAIR_types.h
A source/blender/makesdna/DNA_hair_types.h
M source/blender/makesdna/DNA_meshdata_types.h
M source/blender/makesdna/DNA_modifier_types.h
M source/blender/makesdna/DNA_rigidbody_types.h
M source/blender/makesdna/intern/makesdna.c
M source/blender/makesrna/RNA_access.h
M source/blender/makesrna/intern/CMakeLists.txt
M source/blender/makesrna/intern/makesrna.c
A source/blender/makesrna/intern/rna_hair.c
M source/blender/makesrna/intern/rna_internal.h
A source/blender/makesrna/intern/rna_mesh_sample.c
M source/blender/makesrna/intern/rna_modifier.c
M source/blender/makesrna/intern/rna_rigidbody.c
M source/blender/modifiers/CMakeLists.txt
M source/blender/modifiers/MOD_modifiertypes.h
M source/blender/modifiers/SConscript
A source/blender/modifiers/intern/MOD_hair.c
M source/blender/modifiers/intern/MOD_util.c
===================================================================
diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake
index adbba81..788a359 100644
--- a/build_files/cmake/macros.cmake
+++ b/build_files/cmake/macros.cmake
@@ -496,6 +496,7 @@ macro(SETUP_BLENDER_SORTED_LIBS)
bf_freestyle
bf_ikplugin
bf_modifiers
+ bf_hair
bf_bmesh
bf_blenkernel
bf_nodes
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index 4a13f26..261c54a 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -1194,15 +1194,10 @@ class CyclesParticle_PT_textures(CyclesButtonsPanel, Panel):
layout.template_ID(slot, "texture", new="texture.new")
-class CyclesRender_PT_CurveRendering(CyclesButtonsPanel, Panel):
+# generic curve rendering panel base class,
+# used for both particles and hair systems
+class CyclesCurveRenderingPanel(CyclesButtonsPanel):
bl_label = "Cycles Hair Rendering"
- bl_context = "particle"
-
- @classmethod
- def poll(cls, context):
- scene = context.scene
- psys = context.particle_system
- return CyclesButtonsPanel.poll(context) and psys and psys.settings.type == 'HAIR'
def draw_header(self, context):
ccscene = context.scene.cycles_curves
@@ -1232,6 +1227,24 @@ class CyclesRender_PT_CurveRendering(CyclesButtonsPanel, Panel):
row.prop(ccscene, "maximum_width", text="Max Ext.")
+class CyclesRender_PT_ParticleCurves(CyclesCurveRenderingPanel, Panel):
+ bl_context = "particle"
+
+ @classmethod
+ def poll(cls, context):
+ scene = context.scene
+ psys = context.particle_system
+ return CyclesButtonsPanel.poll(context) and psys and psys.settings.type == 'HAIR'
+
+
+class CyclesRender_PT_HairCurves(CyclesCurveRenderingPanel, Panel):
+ bl_context = "physics"
+
+ @classmethod
+ def poll(cls, context):
+ return CyclesButtonsPanel.poll(context) and context.hair
+
+
class CyclesRender_PT_bake(CyclesButtonsPanel, Panel):
bl_label = "Bake"
bl_context = "render"
diff --git a/intern/cycles/blender/blender_curves.cpp b/intern/cycles/blender/blender_curves.cpp
index 7b1a8ec..d4597dd 100644
--- a/intern/cycles/blender/blender_curves.cpp
+++ b/intern/cycles/blender/blender_curves.cpp
@@ -38,11 +38,10 @@ void InterpolateKeySegments(int seg, int segno, int key, int curve, float3 *keyl
bool ObtainCacheParticleUV(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool background, int uv_num);
bool ObtainCacheParticleVcol(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool background, int vcol_num);
bool ObtainCacheParticleData(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool background);
-void ExportCurveSegments(Scene *scene, Mesh *mesh, ParticleCurveData *CData);
-void ExportCurveTrianglePlanes(Mesh *mesh, ParticleCurveData *CData, float3 RotCam);
-void ExportCurveTriangleGeometry(Mesh *mesh, ParticleCurveData *CData, int resolution);
-void ExportCurveTriangleUV(Mesh *mesh, ParticleCurveData *CData, int vert_offset, int resol, float3 *uvdata);
-void ExportCurveTriangleVcol(Mesh *mesh, ParticleCurveData *CData, int vert_offset, int resol, uchar4 *cdata);
+void ExportParticleCurveTrianglePlanes(Mesh *mesh, ParticleCurveData *CData, float3 RotCam);
+void ExportParticleCurveTriangleGeometry(Mesh *mesh, ParticleCurveData *CData, int resolution);
+void ExportParticleCurveTriangleUV(Mesh *mesh, ParticleCurveData *CData, int vert_offset, int resol, float3 *uvdata);
+void ExportParticleCurveTriangleVcol(Mesh *mesh, ParticleCurveData *CData, int vert_offset, int resol, uchar4 *cdata);
ParticleCurveData::ParticleCurveData()
{
@@ -328,7 +327,7 @@ static void set_resolution(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, BL::S
}
}
-void ExportCurveTrianglePlanes(Mesh *mesh, ParticleCurveData *CData, float3 RotCam)
+void ExportParticleCurveTrianglePlanes(Mesh *mesh, ParticleCurveData *CData, float3 RotCam)
{
int vertexno = mesh->verts.size();
int vertexindex = vertexno;
@@ -408,7 +407,7 @@ void ExportCurveTrianglePlanes(Mesh *mesh, ParticleCurveData *CData, float3 RotC
/* texture coords still needed */
}
-void ExportCurveTriangleGeometry(Mesh *mesh, ParticleCurveData *CData, int resolution)
+void ExportParticleCurveTriangleGeometry(Mesh *mesh, ParticleCurveData *CData, int resolution)
{
int vertexno = mesh->verts.size();
int vertexindex = vertexno;
@@ -544,7 +543,7 @@ void ExportCurveTriangleGeometry(Mesh *mesh, ParticleCurveData *CData, int resol
/* texture coords still needed */
}
-void ExportCurveSegments(Scene *scene, Mesh *mesh, ParticleCurveData *CData)
+static void ExportParticleCurveSegments(Scene *scene, Mesh *mesh, ParticleCurveData *CData)
{
int num_keys = 0;
int num_curves = 0;
@@ -612,7 +611,7 @@ void ExportCurveSegments(Scene *scene, Mesh *mesh, ParticleCurveData *CData)
}
}
-static void ExportCurveSegmentsMotion(Scene *scene, Mesh *mesh, ParticleCurveData *CData, int time_index)
+static void ExportParticleCurveSegmentsMotion(Scene *scene, Mesh *mesh, ParticleCurveData *CData, int time_index)
{
/* find attribute */
Attribute *attr_mP = mesh->curve_attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
@@ -681,7 +680,348 @@ static void ExportCurveSegmentsMotion(Scene *scene, Mesh *mesh, ParticleCurveDat
}
}
-void ExportCurveTriangleUV(Mesh *mesh, ParticleCurveData *CData, int vert_offset, int resol, float3 *uvdata)
+static void hair_step_iter_eval(BL::HairRenderStepIterator b_step_iter, float3 &co, float3 frame[3], float ¶m)
+{
+ float fco[3], fnor[3], ftan[3], fcotan[3], fhair_radius;
+
+ param = b_step_iter.parameter();
+
+ b_step_iter.eval(fco, &fhair_radius);
+ co = make_float3(fco[0], fco[1], fco[2]);
+
+ b_step_iter.eval_frame(fnor, ftan, fcotan);
+ frame[0] = make_float3(fnor[0], fnor[1], fnor[2]);
+ frame[1] = make_float3(ftan[0], ftan[1], ftan[2]);
+ frame[2] = make_float3(fcotan[0], fcotan[1], fcotan[2]);
+}
+
+/* evaluate curve at each step:
+ * v_p, v, v_n: previous/current/next location
+ * d, d_n: current/next direction
+ * param, param_n: current/next curve parameter
+ */
+static void hair_curve_triangle_step(int step, BL::HairRenderStepIterator b_step_iter, float3 &v_p, float3 &v, float3 &v_n, float3 &d, float3 &d_n,
+ float ¶m, float ¶m_n, float3 frame[3], float3 frame_n[3])
+{
+ if (step == 0) {
+ hair_step_iter_eval(b_step_iter, v, frame, param);
+ v_p = v;
+ b_step_iter.next();
+
+ hair_step_iter_eval(b_step_iter, v_n, frame_n, param_n);
+ d = d_n = v_n - v;
+ b_step_iter.next();
+ }
+ else if (step < b_step_iter.totsteps() - 1) {
+ v_p = v;
+ v = v_n;
+ param = param_n;
+ d = d_n;
+
+ hair_step_iter_eval(b_step_iter, v_n, frame_n, param_n);
+ d_n = v_n - v;
+ b_step_iter.next();
+ }
+ else {
+ param = param_n;
+ v_p = v;
+ v = v_n;
+ d = d_n;
+ }
+}
+
+static void ExportHairCurveTrianglePlanes(Mesh *mesh, BL::HairSystem b_hsys, float3 RotCam)
+{
+ BL::HairRenderSettings b_render(b_hsys.params().render());
+ float shape = b_render.shape();
+ float root_width = b_render.root_width() * b_render.radius_scale();
+ float tip_width = b_render.tip_width() * b_render.radius_scale();
+ bool closetip = b_render.use_closetip();
+ int shader = mesh->used_shaders[clamp(b_render.material_slot()-1, 0, mesh->used_shaders.size()-1)];
+
+ int vertexno = mesh->verts.size();
+ int vertexindex = vertexno;
+ int numverts = 0, numtris = 0;
+
+ BL::HairRenderIterator b_hair_iter = b_hsys.render_iterator();
+ b_hair_iter.init();
+
+ /* compute and reserve size of arrays */
+ int num_curves, num_keys;
+ b_hair_iter.count(&num_curves, &num_keys);
+ numverts += 2 + (num_keys - 1)*2;
+ numtris += (num_keys - 1)*2;
+
+ mesh->verts.reserve(mesh->verts.size() + numverts);
+ mesh->triangles.reserve(mesh->triangles.size() + numtris);
+ mesh->shader.reserve(mesh->shader.size() + numtris);
+ mesh->smooth.reserve(mesh->smooth.size() + numtris);
+
+ /* actually export */
+ for (; b_hair_iter.valid(); b_hair_iter.next()) {
+ BL::HairRenderStepIterator b_step_iter = b_hair_iter.step_init();
+ int totsteps = b_step_iter.totsteps();
+ if (totsteps <= 1)
+ continue;
+
+ float3 v_p, v, v_n, d, d_n, frame[3], frame_n[3];
+ float param, param_n;
+
+ for (int step = 0; step < totsteps; ++step) {
+ hair_curve_triangle_step(step, b_step_iter, v_p, v, v_n, d, d_n, param, param_n, frame, frame_n);
+
+ float radius = shaperadius(shape, root_width, tip_width, param);
+ if (closetip && step == totsteps - 1)
+ radius = 0.0f;
+
+ float3 ickey_loc = v;
+ float3 xbasis = normalize(cross(RotCam - ickey_loc, d));
+ float3 ickey_loc_shfl = ickey_loc - radius * xbasis;
+ float3 ickey_loc_shfr = ickey_loc + radius * xbasis;
+ mesh->verts.push_back(ickey_loc_shfl);
+ mesh->verts.push_back(ickey_loc_shfr);
+ if (step > 0) {
+ mesh->add_triangle(vertexindex-2, vertexindex, vertexindex-1, shader, true);
+ mesh->add_triangle(vertexindex+1, vertexindex-1, vertexindex, shader, true);
+ }
+ vertexindex += 2;
+ }
+ }
+ b_hair_iter.end();
+
+ mesh->reserve(mesh->verts.size(), mesh->triangles.size(), 0, 0);
+ mesh->attributes.remove(ATTR_STD_VERTEX_NORMAL);
+ mesh->attributes.remove(ATTR_STD_FACE_NORMAL);
+ mesh->add_face_normals();
+ mesh->add_vertex_normals();
+ mesh->attributes.remove(ATTR_STD_FACE_NORMAL);
+
+ /* texture coords still needed */
+}
+
+static void ExportHairCurveTriangleGeometry(Mesh *mesh, BL::HairSystem b_hsys, int resolution)
+{
+ BL::HairRenderSettings b_render(b_hsys.params().render());
+ float shape = b_render.shape();
+ float root_width = b_render.root_width() * b_render.radius_scale();
+ float tip_width = b_render.tip_width() * b_render.radius_scale();
+ bool closetip = b_render.use_closetip();
+ int shader = mesh->used_shaders[clamp(b_render.material_slot()-1, 0, mesh->used_shaders.size()-1)];
+
+ int vertexno = mesh->verts.size();
+ int vertexindex = vertexno;
+ int numverts = 0, numtris = 0;
+
+ BL::HairRenderIterator b_hair_iter = b_hsys.render_iterator();
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list