37
35
void interp_weights(float t, float data[4], int type);
38
36
float shaperadius(float shape, float root, float tip, float time);
39
37
void InterpolateKeySegments(int seg, int segno, int key, int curve, float3 *keyloc, float *time, ParticleCurveData *CData, int interpolation);
40
bool ObtainCacheParticleUV(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, bool background, int uv_num);
41
bool ObtainCacheParticleVcol(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, bool background, int vcol_num);
42
bool ObtainCacheParticleData(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, bool background);
43
void ExportCurveSegments(Mesh *mesh, ParticleCurveData *CData, int interpolation, int segments);
44
void ExportCurveTrianglePlanes(Mesh *mesh, ParticleCurveData *CData, int interpolation, bool use_smooth, int segments, float3 RotCam);
45
void ExportCurveTriangleRibbons(Mesh *mesh, ParticleCurveData *CData, int interpolation, bool use_smooth, int segments);
46
void ExportCurveTriangleGeometry(Mesh *mesh, ParticleCurveData *CData, int interpolation, bool use_smooth, int resolution, int segments);
47
void ExportCurveTriangleUV(Mesh *mesh, ParticleCurveData *CData, int interpolation, int segments, int vert_offset, int resol, float3 *uvdata);
48
void ExportCurveTriangleVcol(Mesh *mesh, ParticleCurveData *CData, int interpolation, int segments, int vert_offset, int resol, float3 *fdata);
38
bool ObtainCacheParticleUV(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool background, int uv_num);
39
bool ObtainCacheParticleVcol(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool background, int vcol_num);
40
bool ObtainCacheParticleData(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool background);
41
void ExportCurveSegments(Scene *scene, Mesh *mesh, ParticleCurveData *CData);
42
void ExportCurveTrianglePlanes(Mesh *mesh, ParticleCurveData *CData, float3 RotCam);
43
void ExportCurveTriangleGeometry(Mesh *mesh, ParticleCurveData *CData, int resolution);
44
void ExportCurveTriangleUV(Mesh *mesh, ParticleCurveData *CData, int vert_offset, int resol, float3 *uvdata);
45
void ExportCurveTriangleVcol(Mesh *mesh, ParticleCurveData *CData, int vert_offset, int resol, float3 *fdata);
50
47
ParticleCurveData::ParticleCurveData()
404
401
for( int sys = 0; sys < CData->psys_firstcurve.size() ; sys++) {
405
402
for( int curve = CData->psys_firstcurve[sys]; curve < CData->psys_firstcurve[sys] + CData->psys_curvenum[sys] ; curve++) {
407
for( int curvekey = CData->curve_firstkey[curve]; curvekey < CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1; curvekey++) {
414
if(curvekey == CData->curve_firstkey[curve]) {
416
v1 = CData->curvekey_co[min(curvekey+2,CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1)] - CData->curvekey_co[curvekey];
418
else if(curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1)
419
v1 = CData->curvekey_co[curvekey] - CData->curvekey_co[max(curvekey - 2, CData->curve_firstkey[curve])];
407
float3 ickey_loc = CData->curvekey_co[CData->curve_firstkey[curve]];
408
float radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], 0.0f);
409
v1 = CData->curvekey_co[CData->curve_firstkey[curve] + 1] - CData->curvekey_co[CData->curve_firstkey[curve]];
410
xbasis = normalize(cross(RotCam - ickey_loc,v1));
411
float3 ickey_loc_shfl = ickey_loc - radius * xbasis;
412
float3 ickey_loc_shfr = ickey_loc + radius * xbasis;
413
mesh->verts.push_back(ickey_loc_shfl);
414
mesh->verts.push_back(ickey_loc_shfr);
417
for( int curvekey = CData->curve_firstkey[curve] + 1; curvekey < CData->curve_firstkey[curve] + CData->curve_keynum[curve]; curvekey++) {
418
ickey_loc = CData->curvekey_co[curvekey];
420
if(curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1)
421
v1 = CData->curvekey_co[curvekey] - CData->curvekey_co[max(curvekey - 1, CData->curve_firstkey[curve])];
421
423
v1 = CData->curvekey_co[curvekey + 1] - CData->curvekey_co[curvekey - 1];
424
for (; subv <= segments; subv++) {
426
float3 ickey_loc = make_float3(0.0f,0.0f,0.0f);
429
if ((interpolation == CURVE_BSPLINE) && (curvekey == CData->curve_firstkey[curve]) && (subv == 0))
430
ickey_loc = CData->curvekey_co[curvekey];
432
InterpolateKeySegments(subv, segments, curvekey, curve, &ickey_loc, &time, CData , interpolation);
434
float radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], time);
436
if((curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) && (subv == segments))
437
radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], 0.95f);
439
if(CData->psys_closetip[sys] && (subv == segments) && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2))
440
radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], 0.0f, 0.95f);
442
xbasis = normalize(cross(RotCam - ickey_loc,v1));
443
float3 ickey_loc_shfl = ickey_loc - radius * xbasis;
444
float3 ickey_loc_shfr = ickey_loc + radius * xbasis;
445
mesh->verts.push_back(ickey_loc_shfl);
446
mesh->verts.push_back(ickey_loc_shfr);
448
mesh->add_triangle(vertexindex-2, vertexindex, vertexindex-1, CData->psys_shader[sys], use_smooth);
449
mesh->add_triangle(vertexindex+1, vertexindex-1, vertexindex, CData->psys_shader[sys], use_smooth);
457
mesh->reserve(mesh->verts.size(), mesh->triangles.size(), 0, 0);
458
mesh->attributes.remove(ATTR_STD_VERTEX_NORMAL);
459
mesh->attributes.remove(ATTR_STD_FACE_NORMAL);
460
mesh->add_face_normals();
461
mesh->add_vertex_normals();
462
mesh->attributes.remove(ATTR_STD_FACE_NORMAL);
464
/* texture coords still needed */
467
void ExportCurveTriangleRibbons(Mesh *mesh, ParticleCurveData *CData, int interpolation, bool use_smooth, int segments)
469
int vertexno = mesh->verts.size();
470
int vertexindex = vertexno;
472
for( int sys = 0; sys < CData->psys_firstcurve.size() ; sys++) {
473
for( int curve = CData->psys_firstcurve[sys]; curve < CData->psys_firstcurve[sys] + CData->psys_curvenum[sys] ; curve++) {
475
float3 firstxbasis = cross(make_float3(1.0f,0.0f,0.0f),CData->curvekey_co[CData->curve_firstkey[curve]+1] - CData->curvekey_co[CData->curve_firstkey[curve]]);
476
if(len_squared(firstxbasis)!= 0.0f)
477
firstxbasis = normalize(firstxbasis);
479
firstxbasis = normalize(cross(make_float3(0.0f,1.0f,0.0f),CData->curvekey_co[CData->curve_firstkey[curve]+1] - CData->curvekey_co[CData->curve_firstkey[curve]]));
481
for( int curvekey = CData->curve_firstkey[curve]; curvekey < CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1; curvekey++) {
483
float3 xbasis = firstxbasis;
487
if(curvekey == CData->curve_firstkey[curve]) {
488
v1 = CData->curvekey_co[min(curvekey+2,CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1)] - CData->curvekey_co[curvekey+1];
489
v2 = CData->curvekey_co[curvekey+1] - CData->curvekey_co[curvekey];
491
else if(curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1) {
492
v1 = CData->curvekey_co[curvekey] - CData->curvekey_co[curvekey-1];
493
v2 = CData->curvekey_co[curvekey-1] - CData->curvekey_co[max(curvekey-2,CData->curve_firstkey[curve])];
496
v1 = CData->curvekey_co[curvekey+1] - CData->curvekey_co[curvekey];
497
v2 = CData->curvekey_co[curvekey] - CData->curvekey_co[curvekey-1];
500
xbasis = cross(v1,v2);
502
if(len_squared(xbasis) >= 0.05f * len_squared(v1) * len_squared(v2)) {
503
firstxbasis = normalize(xbasis);
508
for( int curvekey = CData->curve_firstkey[curve]; curvekey < CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1; curvekey++) {
515
if(curvekey == CData->curve_firstkey[curve]) {
517
v1 = CData->curvekey_co[min(curvekey+2,CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1)] - CData->curvekey_co[curvekey+1];
518
v2 = CData->curvekey_co[curvekey+1] - CData->curvekey_co[curvekey];
520
else if(curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1) {
521
v1 = CData->curvekey_co[curvekey] - CData->curvekey_co[curvekey-1];
522
v2 = CData->curvekey_co[curvekey-1] - CData->curvekey_co[max(curvekey-2,CData->curve_firstkey[curve])];
525
v1 = CData->curvekey_co[curvekey+1] - CData->curvekey_co[curvekey];
526
v2 = CData->curvekey_co[curvekey] - CData->curvekey_co[curvekey-1];
529
xbasis = cross(v1,v2);
531
if(len_squared(xbasis) >= 0.05f * len_squared(v1) * len_squared(v2)) {
532
xbasis = normalize(xbasis);
533
firstxbasis = xbasis;
536
xbasis = firstxbasis;
538
for (; subv <= segments; subv++) {
540
float3 ickey_loc = make_float3(0.0f,0.0f,0.0f);
543
if ((interpolation == CURVE_BSPLINE) && (curvekey == CData->curve_firstkey[curve]) && (subv == 0))
544
ickey_loc = CData->curvekey_co[curvekey];
546
InterpolateKeySegments(subv, segments, curvekey, curve, &ickey_loc, &time, CData , interpolation);
548
float radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], time);
550
if((curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) && (subv == segments))
551
radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], 0.95f);
553
if(CData->psys_closetip[sys] && (subv == segments) && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2))
554
radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], 0.0f, 0.95f);
556
float3 ickey_loc_shfl = ickey_loc - radius * xbasis;
557
float3 ickey_loc_shfr = ickey_loc + radius * xbasis;
558
mesh->verts.push_back(ickey_loc_shfl);
559
mesh->verts.push_back(ickey_loc_shfr);
561
mesh->add_triangle(vertexindex-2, vertexindex, vertexindex-1, CData->psys_shader[sys], use_smooth);
562
mesh->add_triangle(vertexindex+1, vertexindex-1, vertexindex, CData->psys_shader[sys], use_smooth);
570
mesh->reserve(mesh->verts.size(), mesh->triangles.size(), 0, 0);
571
mesh->attributes.remove(ATTR_STD_VERTEX_NORMAL);
572
mesh->attributes.remove(ATTR_STD_FACE_NORMAL);
573
mesh->add_face_normals();
574
mesh->add_vertex_normals();
575
mesh->attributes.remove(ATTR_STD_FACE_NORMAL);
576
/* texture coords still needed */
580
void ExportCurveTriangleGeometry(Mesh *mesh, ParticleCurveData *CData, int interpolation, bool use_smooth, int resolution, int segments)
425
time = CData->curvekey_time[curvekey]/CData->curve_length[curve];
426
radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], time);
428
if(curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1)
429
radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], 0.95f);
431
if(CData->psys_closetip[sys] && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1))
432
radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], 0.0f, 0.95f);
434
xbasis = normalize(cross(RotCam - ickey_loc,v1));
435
float3 ickey_loc_shfl = ickey_loc - radius * xbasis;
436
float3 ickey_loc_shfr = ickey_loc + radius * xbasis;
437
mesh->verts.push_back(ickey_loc_shfl);
438
mesh->verts.push_back(ickey_loc_shfr);
439
mesh->add_triangle(vertexindex-2, vertexindex, vertexindex-1, CData->psys_shader[sys], true);
440
mesh->add_triangle(vertexindex+1, vertexindex-1, vertexindex, CData->psys_shader[sys], true);
446
mesh->reserve(mesh->verts.size(), mesh->triangles.size(), 0, 0);
447
mesh->attributes.remove(ATTR_STD_VERTEX_NORMAL);
448
mesh->attributes.remove(ATTR_STD_FACE_NORMAL);
449
mesh->add_face_normals();
450
mesh->add_vertex_normals();
451
mesh->attributes.remove(ATTR_STD_FACE_NORMAL);
453
/* texture coords still needed */
456
void ExportCurveTriangleGeometry(Mesh *mesh, ParticleCurveData *CData, int resolution)
582
458
int vertexno = mesh->verts.size();
583
459
int vertexindex = vertexno;
785
644
for( int curvekey = CData->curve_firstkey[curve]; curvekey < CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1; curvekey++) {
789
if (curvekey == CData->curve_firstkey[curve])
646
time = CData->curvekey_time[curvekey]/CData->curve_length[curve];
648
for(int section = 0 ; section < resol; section++) {
649
uvdata[vertexindex] = CData->curve_uv[curve];
650
uvdata[vertexindex].z = prevtime;
652
uvdata[vertexindex] = CData->curve_uv[curve];
653
uvdata[vertexindex].z = time;
655
uvdata[vertexindex] = CData->curve_uv[curve];
656
uvdata[vertexindex].z = prevtime;
658
uvdata[vertexindex] = CData->curve_uv[curve];
659
uvdata[vertexindex].z = time;
661
uvdata[vertexindex] = CData->curve_uv[curve];
662
uvdata[vertexindex].z = prevtime;
664
uvdata[vertexindex] = CData->curve_uv[curve];
665
uvdata[vertexindex].z = time;
792
for (; subv <= segments; subv++) {
794
float3 ickey_loc = make_float3(0.0f,0.0f,0.0f);
796
InterpolateKeySegments(subv, segments, curvekey, curve, &ickey_loc, &time, CData , interpolation);
799
for(int section = 0 ; section < resol; section++) {
800
uvdata[vertexindex] = CData->curve_uv[curve];
801
uvdata[vertexindex].z = prevtime;
803
uvdata[vertexindex] = CData->curve_uv[curve];
804
uvdata[vertexindex].z = time;
806
uvdata[vertexindex] = CData->curve_uv[curve];
807
uvdata[vertexindex].z = prevtime;
809
uvdata[vertexindex] = CData->curve_uv[curve];
810
uvdata[vertexindex].z = time;
812
uvdata[vertexindex] = CData->curve_uv[curve];
813
uvdata[vertexindex].z = prevtime;
815
uvdata[vertexindex] = CData->curve_uv[curve];
816
uvdata[vertexindex].z = time;
829
void ExportCurveTriangleVcol(Mesh *mesh, ParticleCurveData *CData, int interpolation, int segments, int vert_offset, int resol, float3 *fdata)
677
void ExportCurveTriangleVcol(Mesh *mesh, ParticleCurveData *CData, int vert_offset, int resol, float3 *fdata)
831
679
if(fdata == NULL)
835
// float prevtime = 0.0f; // UNUSED
837
682
int vertexindex = vert_offset;
839
684
for( int sys = 0; sys < CData->psys_firstcurve.size() ; sys++) {
892
719
curve_system_manager->minimum_width = get_float(csscene, "minimum_width");
893
720
curve_system_manager->maximum_width = get_float(csscene, "maximum_width");
895
if(preset == CURVE_CUSTOM) {
896
/*custom properties*/
897
curve_system_manager->primitive = get_enum(csscene, "primitive");
898
curve_system_manager->line_method = get_enum(csscene, "line_method");
899
curve_system_manager->interpolation = get_enum(csscene, "interpolation");
900
curve_system_manager->triangle_method = get_enum(csscene, "triangle_method");
901
curve_system_manager->resolution = get_int(csscene, "resolution");
902
curve_system_manager->segments = get_int(csscene, "segments");
903
curve_system_manager->use_smooth = get_boolean(csscene, "use_smooth");
904
curve_system_manager->subdivisions = get_int(csscene, "subdivisions");
906
curve_system_manager->normalmix = get_float(csscene, "normalmix");
907
curve_system_manager->encasing_ratio = get_float(csscene, "encasing_ratio");
909
curve_system_manager->use_parents = get_boolean(csscene, "use_parents");
910
curve_system_manager->use_encasing = get_boolean(csscene, "use_encasing");
911
curve_system_manager->use_backfacing = get_boolean(csscene, "use_backfacing");
912
curve_system_manager->use_joined = get_boolean(csscene, "use_joined");
913
curve_system_manager->use_tangent_normal = get_boolean(csscene, "use_tangent_normal");
914
curve_system_manager->use_tangent_normal_geometry = get_boolean(csscene, "use_tangent_normal_geometry");
915
curve_system_manager->use_tangent_normal_correction = get_boolean(csscene, "use_tangent_normal_correction");
918
curve_system_manager->primitive = CURVE_LINE_SEGMENTS;
919
curve_system_manager->interpolation = CURVE_CARDINAL;
920
curve_system_manager->normalmix = 1.0f;
921
curve_system_manager->encasing_ratio = 1.01f;
922
curve_system_manager->use_parents = false;
923
curve_system_manager->segments = 1;
924
curve_system_manager->use_joined = false;
927
case CURVE_FAST_PLANES:
928
/*camera facing planes*/
929
curve_system_manager->primitive = CURVE_TRIANGLES;
930
curve_system_manager->triangle_method = CURVE_CAMERA_TRIANGLES;
931
curve_system_manager->use_smooth = true;
932
curve_system_manager->resolution = 1;
934
case CURVE_TANGENT_SHADING:
936
curve_system_manager->line_method = CURVE_UNCORRECTED;
937
curve_system_manager->use_encasing = true;
938
curve_system_manager->use_backfacing = false;
939
curve_system_manager->use_tangent_normal = true;
940
curve_system_manager->use_tangent_normal_geometry = true;
941
curve_system_manager->use_tangent_normal_correction = false;
943
case CURVE_TRUE_NORMAL:
945
curve_system_manager->line_method = CURVE_CORRECTED;
946
curve_system_manager->use_encasing = true;
947
curve_system_manager->use_backfacing = false;
948
curve_system_manager->use_tangent_normal = false;
949
curve_system_manager->use_tangent_normal_geometry = false;
950
curve_system_manager->use_tangent_normal_correction = false;
952
case CURVE_ACCURATE_PRESET:
954
curve_system_manager->line_method = CURVE_ACCURATE;
955
curve_system_manager->use_encasing = false;
956
curve_system_manager->use_backfacing = true;
957
curve_system_manager->use_tangent_normal = false;
958
curve_system_manager->use_tangent_normal_geometry = false;
959
curve_system_manager->use_tangent_normal_correction = false;
961
case CURVE_SMOOTH_CURVES:
962
/*Cardinal curves preset*/
963
curve_system_manager->primitive = CURVE_SEGMENTS;
964
curve_system_manager->use_backfacing = true;
965
curve_system_manager->subdivisions = 4;
967
case CURVE_SMOOTH_RIBBONS:
968
/*Cardinal ribbons preset*/
969
curve_system_manager->primitive = CURVE_RIBBONS;
970
curve_system_manager->use_backfacing = false;
971
curve_system_manager->subdivisions = 4;
722
curve_system_manager->primitive = get_enum(csscene, "primitive");
723
curve_system_manager->curve_shape = get_enum(csscene, "shape");
724
curve_system_manager->resolution = get_int(csscene, "resolution");
725
curve_system_manager->subdivisions = get_int(csscene, "subdivisions");
726
curve_system_manager->use_backfacing = !get_boolean(csscene, "cull_backfacing");
728
curve_system_manager->encasing_ratio = 1.01f;
730
if(curve_system_manager->primitive == CURVE_TRIANGLES && curve_system_manager->curve_shape == CURVE_RIBBON) {
731
/*camera facing planes*/
732
curve_system_manager->triangle_method = CURVE_CAMERA_TRIANGLES;
733
curve_system_manager->resolution = 1;
735
if(curve_system_manager->primitive == CURVE_TRIANGLES && curve_system_manager->curve_shape == CURVE_THICK) {
736
/*camera facing planes*/
737
curve_system_manager->triangle_method = CURVE_TESSELATED_TRIANGLES;
739
if(curve_system_manager->primitive == CURVE_LINE_SEGMENTS && curve_system_manager->curve_shape == CURVE_RIBBON) {
741
curve_system_manager->line_method = CURVE_UNCORRECTED;
742
curve_system_manager->use_encasing = true;
743
curve_system_manager->use_backfacing = false;
744
curve_system_manager->use_tangent_normal = true;
745
curve_system_manager->use_tangent_normal_geometry = true;
747
if(curve_system_manager->primitive == CURVE_LINE_SEGMENTS && curve_system_manager->curve_shape == CURVE_THICK) {
748
curve_system_manager->line_method = CURVE_ACCURATE;
749
curve_system_manager->use_encasing = false;
750
curve_system_manager->use_tangent_normal = false;
751
curve_system_manager->use_tangent_normal_geometry = false;
753
if(curve_system_manager->primitive == CURVE_SEGMENTS && curve_system_manager->curve_shape == CURVE_RIBBON) {
754
curve_system_manager->primitive = CURVE_RIBBONS;
755
curve_system_manager->use_backfacing = false;
977
758
if(curve_system_manager->modified_mesh(prev_curve_system_manager))