[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53527] trunk/blender/intern/cycles: Cycles Hair: refactoring to support generic attributes for hair curves.
Brecht Van Lommel
brechtvanlommel at pandora.be
Thu Jan 3 13:08:59 CET 2013
Revision: 53527
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53527
Author: blendix
Date: 2013-01-03 12:08:54 +0000 (Thu, 03 Jan 2013)
Log Message:
-----------
Cycles Hair: refactoring to support generic attributes for hair curves. There
should be no functional changes yet. UV, tangent and intercept are now stored
as attributes, with the intention to add more like multiple uv's, vertex
colors, generated coordinates and motion vectors later.
Things got a bit messy due to having both triangle and curve data in the same
mesh data structure, which also gives us two sets of attributes. This will get
cleaned up when we split the mesh class.
Modified Paths:
--------------
trunk/blender/intern/cycles/blender/blender_curves.cpp
trunk/blender/intern/cycles/blender/blender_mesh.cpp
trunk/blender/intern/cycles/bvh/bvh.cpp
trunk/blender/intern/cycles/bvh/bvh_build.cpp
trunk/blender/intern/cycles/bvh/bvh_split.cpp
trunk/blender/intern/cycles/kernel/CMakeLists.txt
trunk/blender/intern/cycles/kernel/kernel_bvh.h
trunk/blender/intern/cycles/kernel/kernel_light.h
trunk/blender/intern/cycles/kernel/kernel_object.h
trunk/blender/intern/cycles/kernel/kernel_passes.h
trunk/blender/intern/cycles/kernel/kernel_path.h
trunk/blender/intern/cycles/kernel/kernel_shader.h
trunk/blender/intern/cycles/kernel/kernel_textures.h
trunk/blender/intern/cycles/kernel/kernel_triangle.h
trunk/blender/intern/cycles/kernel/kernel_types.h
trunk/blender/intern/cycles/kernel/osl/osl_services.cpp
trunk/blender/intern/cycles/kernel/osl/osl_services.h
trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp
trunk/blender/intern/cycles/kernel/osl/osl_shader.h
trunk/blender/intern/cycles/kernel/shaders/node_hair_info.osl
trunk/blender/intern/cycles/kernel/svm/svm_attribute.h
trunk/blender/intern/cycles/kernel/svm/svm_geometry.h
trunk/blender/intern/cycles/kernel/svm/svm_tex_coord.h
trunk/blender/intern/cycles/render/attribute.cpp
trunk/blender/intern/cycles/render/attribute.h
trunk/blender/intern/cycles/render/curves.h
trunk/blender/intern/cycles/render/light.cpp
trunk/blender/intern/cycles/render/mesh.cpp
trunk/blender/intern/cycles/render/mesh.h
trunk/blender/intern/cycles/render/nodes.cpp
trunk/blender/intern/cycles/render/nodes.h
trunk/blender/intern/cycles/render/object.cpp
trunk/blender/intern/cycles/render/scene.h
trunk/blender/intern/cycles/subd/subd_dice.cpp
trunk/blender/intern/cycles/util/CMakeLists.txt
trunk/blender/intern/cycles/util/util_types.h
Added Paths:
-----------
trunk/blender/intern/cycles/kernel/kernel_curve.h
trunk/blender/intern/cycles/kernel/kernel_primitive.h
Removed Paths:
-------------
trunk/blender/intern/cycles/kernel/kernel_attribute.h
trunk/blender/intern/cycles/util/util_attribute.cpp
trunk/blender/intern/cycles/util/util_attribute.h
Modified: trunk/blender/intern/cycles/blender/blender_curves.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_curves.cpp 2013-01-03 09:18:34 UTC (rev 53526)
+++ trunk/blender/intern/cycles/blender/blender_curves.cpp 2013-01-03 12:08:54 UTC (rev 53527)
@@ -67,8 +67,7 @@
curve_firstkey.clear();
curve_keynum.clear();
curve_length.clear();
- curve_u.clear();
- curve_v.clear();
+ curve_uv.clear();
curvekey_co.clear();
curvekey_time.clear();
@@ -78,13 +77,13 @@
{
float t2, t3, fc;
- if (type == CURVE_LINEAR) {
+ if(type == CURVE_LINEAR) {
data[0] = 0.0f;
data[1] = -t + 1.0f;
data[2] = t;
data[3] = 0.0f;
}
- else if (type == CURVE_CARDINAL) {
+ else if(type == CURVE_CARDINAL) {
t2 = t * t;
t3 = t2 * t;
fc = 0.71f;
@@ -94,7 +93,7 @@
data[2] = (fc - 2.0f) * t3 + (3.0f - 2.0f * fc) * t2 + fc * t;
data[3] = fc * t3 - fc * t2;
}
- else if (type == CURVE_BSPLINE) {
+ else if(type == CURVE_BSPLINE) {
t2 = t * t;
t3 = t2 * t;
@@ -115,8 +114,8 @@
float shaperadius(float shape, float root, float tip, float time)
{
float radius = 1.0f - time;
- if (shape != 0.0f) {
- if (shape < 0.0f)
+ if(shape != 0.0f) {
+ if(shape < 0.0f)
radius = (float)pow(1.0f - time, 1.f + shape);
else
radius = (float)pow(1.0f - time, 1.f / (1.f - shape));
@@ -133,10 +132,10 @@
float3 ckey_loc3 = CData->curvekey_co[key+1];
float3 ckey_loc4 = ckey_loc3;
- if (key > CData->curve_firstkey[curve])
+ if(key > CData->curve_firstkey[curve])
ckey_loc1 = CData->curvekey_co[key - 1];
- if (key < CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2)
+ if(key < CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2)
ckey_loc4 = CData->curvekey_co[key + 2];
@@ -167,7 +166,7 @@
BL::Object::modifiers_iterator b_mod;
for(b_ob->modifiers.begin(b_mod); b_mod != b_ob->modifiers.end(); ++b_mod) {
- if ((b_mod->type() == b_mod->type_PARTICLE_SYSTEM) && (b_mod->show_viewport()) && (b_mod->show_render())) {
+ if((b_mod->type() == b_mod->type_PARTICLE_SYSTEM) && (b_mod->show_viewport()) && (b_mod->show_render())) {
BL::ParticleSystemModifier psmd(b_mod->ptr);
@@ -213,7 +212,7 @@
float nco[3];
b_cKey->co_object( *b_ob, psmd, *b_pa, nco);
float3 cKey = make_float3(nco[0],nco[1],nco[2]);
- if (step_no > 0)
+ if(step_no > 0)
curve_length += len(cKey - pcKey);
CData->curvekey_co.push_back(cKey);
CData->curvekey_time.push_back(curve_length);
@@ -227,11 +226,10 @@
BL::Mesh::tessface_uv_textures_iterator l;
b_mesh->tessface_uv_textures.begin(l);
- float uvs[3] = {0,0};
+ float3 uv = make_float3(0.0f, 0.0f, 0.0f);
if(b_mesh->tessface_uv_textures.length())
- b_pa->uv_on_emitter(psmd,uvs);
- CData->curve_u.push_back(uvs[0]);
- CData->curve_v.push_back(uvs[1]);
+ b_pa->uv_on_emitter(psmd,&uv.x);
+ CData->curve_uv.push_back(uv);
curvenum++;
@@ -258,7 +256,7 @@
BL::Object::modifiers_iterator b_mod;
for(b_ob->modifiers.begin(b_mod); b_mod != b_ob->modifiers.end(); ++b_mod) {
- if ((b_mod->type() == b_mod->type_PARTICLE_SYSTEM) && (b_mod->show_viewport()) && (b_mod->show_render())) {
+ if((b_mod->type() == b_mod->type_PARTICLE_SYSTEM) && (b_mod->show_viewport()) && (b_mod->show_render())) {
BL::ParticleSystemModifier psmd((const PointerRNA)b_mod->ptr);
BL::ParticleSystem b_psys((const PointerRNA)psmd.particle_system().ptr);
@@ -277,10 +275,10 @@
int totchild = b_psys.child_particles.length() * b_psys.settings().draw_percentage() / 100;
int totcurves = totchild;
- if (use_parents || b_psys.settings().child_type() == 0)
+ if(use_parents || b_psys.settings().child_type() == 0)
totcurves += totparts;
- if (totcurves == 0)
+ if(totcurves == 0)
continue;
PointerRNA cpsys = RNA_pointer_get(&b_part.ptr, "cycles");
@@ -314,7 +312,7 @@
b_psys.co_hair(*b_ob, psmd, pa_no, step_no, nco);
float3 cKey = make_float3(nco[0],nco[1],nco[2]);
cKey = transform_point(&itfm, cKey);
- if (step_no > 0)
+ if(step_no > 0)
curve_length += len(cKey - pcKey);
CData->curvekey_co.push_back(cKey);
CData->curvekey_time.push_back(curve_length);
@@ -327,17 +325,14 @@
BL::Mesh::tessface_uv_textures_iterator l;
b_mesh->tessface_uv_textures.begin(l);
- float uvs[2] = {0,0};
+ float3 uv = make_float3(0.0f, 0.0f, 0.0f);
if(b_mesh->tessface_uv_textures.length())
- b_psys.uv_on_emitter(psmd, *b_pa, pa_no, uvs);
-
+ b_psys.uv_on_emitter(psmd, *b_pa, pa_no, &uv.x);
+ CData->curve_uv.push_back(uv);
if(pa_no < totparts && b_pa != b_psys.particles.end())
++b_pa;
- CData->curve_u.push_back(uvs[0]);
- CData->curve_v.push_back(uvs[1]);
-
curvenum++;
}
@@ -365,11 +360,11 @@
float3 v1;
- if (curvekey == CData->curve_firstkey[curve]) {
+ if(curvekey == CData->curve_firstkey[curve]) {
subv = 0;
v1 = CData->curvekey_co[curvekey+2] - CData->curvekey_co[curvekey];
}
- else if (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2)
+ else if(curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2)
v1 = CData->curvekey_co[curvekey] - CData->curvekey_co[curvekey - 2];
else
v1 = CData->curvekey_co[curvekey + 1] - CData->curvekey_co[curvekey - 1];
@@ -387,10 +382,10 @@
float radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], time);
- if (CData->psys_closetip[sys] && (subv == segments) && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2))
+ if(CData->psys_closetip[sys] && (subv == segments) && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2))
radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], 0.0f, 0.95f);
- if ((curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) && (subv == segments))
+ if((curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) && (subv == segments))
radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], 0.95f);
xbasis = normalize(cross(v1,RotCam - ickey_loc));
@@ -408,7 +403,7 @@
}
}
- mesh->reserve(mesh->verts.size(), mesh->triangles.size());
+ 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();
@@ -439,11 +434,11 @@
float3 v1;
float3 v2;
- if (curvekey == CData->curve_firstkey[curve]) {
+ if(curvekey == CData->curve_firstkey[curve]) {
v1 = CData->curvekey_co[curvekey+2] - CData->curvekey_co[curvekey+1];
v2 = CData->curvekey_co[curvekey+1] - CData->curvekey_co[curvekey];
}
- else if (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) {
+ else if(curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) {
v1 = CData->curvekey_co[curvekey] - CData->curvekey_co[curvekey-1];
v2 = CData->curvekey_co[curvekey-1] - CData->curvekey_co[curvekey-2];
}
@@ -467,12 +462,12 @@
float3 v2;
float3 xbasis;
- if (curvekey == CData->curve_firstkey[curve]) {
+ if(curvekey == CData->curve_firstkey[curve]) {
subv = 0;
v1 = CData->curvekey_co[curvekey+2] - CData->curvekey_co[curvekey+1];
v2 = CData->curvekey_co[curvekey+1] - CData->curvekey_co[curvekey];
}
- else if (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) {
+ else if(curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) {
v1 = CData->curvekey_co[curvekey] - CData->curvekey_co[curvekey-1];
v2 = CData->curvekey_co[curvekey-1] - CData->curvekey_co[curvekey-2];
}
@@ -502,10 +497,10 @@
float radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], time);
- if (CData->psys_closetip[sys] && (subv == segments) && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2))
+ if(CData->psys_closetip[sys] && (subv == segments) && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2))
radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], 0.0f, 0.95f);
- if ((curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) && (subv == segments))
+ if((curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) && (subv == segments))
radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], 0.95f);
float3 ickey_loc_shfl = ickey_loc - radius * xbasis;
@@ -522,7 +517,7 @@
}
}
- mesh->reserve(mesh->verts.size(), mesh->triangles.size());
+ 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();
@@ -553,11 +548,11 @@
float3 v1;
float3 v2;
- if (curvekey == CData->curve_firstkey[curve]) {
+ if(curvekey == CData->curve_firstkey[curve]) {
v1 = CData->curvekey_co[curvekey+2] - CData->curvekey_co[curvekey+1];
v2 = CData->curvekey_co[curvekey+1] - CData->curvekey_co[curvekey];
}
- else if (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) {
+ else if(curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) {
v1 = CData->curvekey_co[curvekey] - CData->curvekey_co[curvekey-1];
v2 = CData->curvekey_co[curvekey-1] - CData->curvekey_co[curvekey-2];
}
@@ -582,12 +577,12 @@
float3 v1;
float3 v2;
- if (curvekey == CData->curve_firstkey[curve]) {
+ if(curvekey == CData->curve_firstkey[curve]) {
subv = 0;
v1 = CData->curvekey_co[curvekey+2] - CData->curvekey_co[curvekey+1];
v2 = CData->curvekey_co[curvekey+1] - CData->curvekey_co[curvekey];
}
- else if (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) {
+ else if(curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list