Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/subd/subd_split.cpp
| Show First 20 Lines • Show All 109 Lines • ▼ Show 20 Lines | void DiagSplit::partition_edge(Patch *patch, float2 *P, int *t0, int *t1, float2 Pstart, float2 Pend, int t) | ||||
| else { | else { | ||||
| int I = (int)floor((float)t*0.5f); | int I = (int)floor((float)t*0.5f); | ||||
| *P = interp(Pstart, Pend, (t == 0)? 0: I/(float)t); /* XXX is t faces or verts */ | *P = interp(Pstart, Pend, (t == 0)? 0: I/(float)t); /* XXX is t faces or verts */ | ||||
| *t0 = I; | *t0 = I; | ||||
| *t1 = t - I; | *t1 = t - I; | ||||
| } | } | ||||
| } | } | ||||
| static float2 right_to_equilateral(float2 P) { | |||||
brecht: Put `{` on new line to match the coding style convention. | |||||
| static const float2 A = make_float2(1.0f, 0.5f); | |||||
| static const float2 B = make_float2(0.0f, sinf(M_PI_F/3.0f)); | |||||
| return make_float2(dot(P, A), dot(P, B)); | |||||
| } | |||||
| static void limit_edge_factors(const TriangleDice::SubPatch& sub, TriangleDice::EdgeFactors& ef, int max_t) { | |||||
| float2 Pu = sub.Pu; | |||||
| float2 Pv = sub.Pv; | |||||
| float2 Pw = sub.Pw; | |||||
| if(sub.patch->is_triangle()) { | |||||
| Pu = right_to_equilateral(Pu); | |||||
| Pv = right_to_equilateral(Pv); | |||||
| Pw = right_to_equilateral(Pw); | |||||
| } | |||||
| int tu = int(max_t * len(Pw - Pv)); | |||||
| int tv = int(max_t * len(Pw - Pu)); | |||||
| int tw = int(max_t * len(Pv - Pu)); | |||||
| ef.tu = tu <= 1 ? 1 : min(ef.tu, tu); | |||||
| ef.tv = tv <= 1 ? 1 : min(ef.tv, tv); | |||||
| ef.tw = tw <= 1 ? 1 : min(ef.tw, tw); | |||||
| } | |||||
| static void limit_edge_factors(const QuadDice::SubPatch& sub, QuadDice::EdgeFactors& ef, int max_t) { | |||||
| float2 P00 = sub.P00; | |||||
| float2 P01 = sub.P01; | |||||
| float2 P10 = sub.P10; | |||||
| float2 P11 = sub.P11; | |||||
| if(sub.patch->is_triangle()) { | |||||
| P00 = right_to_equilateral(P00); | |||||
| P01 = right_to_equilateral(P01); | |||||
| P10 = right_to_equilateral(P10); | |||||
| P11 = right_to_equilateral(P11); | |||||
| } | |||||
| int tu0 = int(max_t * len(P10 - P00)); | |||||
| int tu1 = int(max_t * len(P11 - P01)); | |||||
| int tv0 = int(max_t * len(P01 - P00)); | |||||
| int tv1 = int(max_t * len(P11 - P10)); | |||||
| ef.tu0 = tu0 <= 1 ? 1 : min(ef.tu0, tu0); | |||||
| ef.tu1 = tu1 <= 1 ? 1 : min(ef.tu1, tu1); | |||||
| ef.tv0 = tv0 <= 1 ? 1 : min(ef.tv0, tv0); | |||||
| ef.tv1 = tv1 <= 1 ? 1 : min(ef.tv1, tv1); | |||||
| } | |||||
| void DiagSplit::split(TriangleDice::SubPatch& sub, TriangleDice::EdgeFactors& ef, int depth) | void DiagSplit::split(TriangleDice::SubPatch& sub, TriangleDice::EdgeFactors& ef, int depth) | ||||
| { | { | ||||
| if(depth > 32) { | if(depth > 32) { | ||||
| fprintf(stderr, "overflow while splitting patches\n"); | fprintf(stderr, "overflow while splitting patches\n"); | ||||
| #ifndef NDEBUG | #ifndef NDEBUG | ||||
| abort(); | abort(); | ||||
| #endif | #endif | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | case 3: { | ||||
| ef2.tu1 = tsplit20; | ef2.tu1 = tsplit20; | ||||
| ef2.tv1 = tsplit12; | ef2.tv1 = tsplit12; | ||||
| /* create subpatches */ | /* create subpatches */ | ||||
| QuadDice::SubPatch sub0 = {sub.patch, sub.Pu, Pw, Pv, Pcenter}; | QuadDice::SubPatch sub0 = {sub.patch, sub.Pu, Pw, Pv, Pcenter}; | ||||
| QuadDice::SubPatch sub1 = {sub.patch, sub.Pw, Pv, Pu, Pcenter}; | QuadDice::SubPatch sub1 = {sub.patch, sub.Pw, Pv, Pu, Pcenter}; | ||||
| QuadDice::SubPatch sub2 = {sub.patch, sub.Pv, Pu, Pw, Pcenter}; | QuadDice::SubPatch sub2 = {sub.patch, sub.Pv, Pu, Pw, Pcenter}; | ||||
| limit_edge_factors(sub0, ef0, 1 << params.max_level); | |||||
| limit_edge_factors(sub1, ef1, 1 << params.max_level); | |||||
| limit_edge_factors(sub2, ef2, 1 << params.max_level); | |||||
| split(sub0, ef0, depth+1); | split(sub0, ef0, depth+1); | ||||
| split(sub1, ef1, depth+1); | split(sub1, ef1, depth+1); | ||||
| split(sub2, ef2, depth+1); | split(sub2, ef2, depth+1); | ||||
| break; | break; | ||||
| } | } | ||||
| default: { | default: { | ||||
| /* all edges uniform, no splitting needed */ | /* all edges uniform, no splitting needed */ | ||||
| Show All 36 Lines | if(split_u) { | ||||
| ef1.tv0 = tsplit; | ef1.tv0 = tsplit; | ||||
| ef1.tv1 = ef.tv1; | ef1.tv1 = ef.tv1; | ||||
| /* create subpatches */ | /* create subpatches */ | ||||
| QuadDice::SubPatch sub0 = {sub.patch, sub.P00, Pu0, sub.P01, Pu1}; | QuadDice::SubPatch sub0 = {sub.patch, sub.P00, Pu0, sub.P01, Pu1}; | ||||
| QuadDice::SubPatch sub1 = {sub.patch, Pu0, sub.P10, Pu1, sub.P11}; | QuadDice::SubPatch sub1 = {sub.patch, Pu0, sub.P10, Pu1, sub.P11}; | ||||
| limit_edge_factors(sub0, ef0, 1 << params.max_level); | |||||
| limit_edge_factors(sub1, ef1, 1 << params.max_level); | |||||
| split(sub0, ef0, depth+1); | split(sub0, ef0, depth+1); | ||||
| split(sub1, ef1, depth+1); | split(sub1, ef1, depth+1); | ||||
| } | } | ||||
| else if(split_v) { | else if(split_v) { | ||||
| /* partition edges */ | /* partition edges */ | ||||
| QuadDice::EdgeFactors ef0, ef1; | QuadDice::EdgeFactors ef0, ef1; | ||||
| float2 Pv0, Pv1; | float2 Pv0, Pv1; | ||||
| Show All 9 Lines | else if(split_v) { | ||||
| ef1.tu0 = tsplit; | ef1.tu0 = tsplit; | ||||
| ef1.tu1 = ef.tu1; | ef1.tu1 = ef.tu1; | ||||
| /* create subpatches */ | /* create subpatches */ | ||||
| QuadDice::SubPatch sub0 = {sub.patch, sub.P00, sub.P10, Pv0, Pv1}; | QuadDice::SubPatch sub0 = {sub.patch, sub.P00, sub.P10, Pv0, Pv1}; | ||||
| QuadDice::SubPatch sub1 = {sub.patch, Pv0, Pv1, sub.P01, sub.P11}; | QuadDice::SubPatch sub1 = {sub.patch, Pv0, Pv1, sub.P01, sub.P11}; | ||||
| limit_edge_factors(sub0, ef0, 1 << params.max_level); | |||||
| limit_edge_factors(sub1, ef1, 1 << params.max_level); | |||||
| split(sub0, ef0, depth+1); | split(sub0, ef0, depth+1); | ||||
| split(sub1, ef1, depth+1); | split(sub1, ef1, depth+1); | ||||
| } | } | ||||
| else { | else { | ||||
| dispatch(sub, ef); | dispatch(sub, ef); | ||||
| } | } | ||||
| } | } | ||||
| void DiagSplit::split_triangle(Patch *patch) | void DiagSplit::split_triangle(Patch *patch) | ||||
| { | { | ||||
| TriangleDice::SubPatch sub_split; | TriangleDice::SubPatch sub_split; | ||||
| TriangleDice::EdgeFactors ef_split; | TriangleDice::EdgeFactors ef_split; | ||||
| sub_split.patch = patch; | sub_split.patch = patch; | ||||
| sub_split.Pu = make_float2(1.0f, 0.0f); | sub_split.Pu = make_float2(1.0f, 0.0f); | ||||
| sub_split.Pv = make_float2(0.0f, 1.0f); | sub_split.Pv = make_float2(0.0f, 1.0f); | ||||
| sub_split.Pw = make_float2(0.0f, 0.0f); | sub_split.Pw = make_float2(0.0f, 0.0f); | ||||
| ef_split.tu = T(patch, sub_split.Pv, sub_split.Pw); | ef_split.tu = T(patch, sub_split.Pv, sub_split.Pw); | ||||
| ef_split.tv = T(patch, sub_split.Pw, sub_split.Pu); | ef_split.tv = T(patch, sub_split.Pw, sub_split.Pu); | ||||
| ef_split.tw = T(patch, sub_split.Pu, sub_split.Pv); | ef_split.tw = T(patch, sub_split.Pu, sub_split.Pv); | ||||
| limit_edge_factors(sub_split, ef_split, 1 << params.max_level); | |||||
| split(sub_split, ef_split); | split(sub_split, ef_split); | ||||
| TriangleDice dice(params); | TriangleDice dice(params); | ||||
| for(size_t i = 0; i < subpatches_triangle.size(); i++) { | for(size_t i = 0; i < subpatches_triangle.size(); i++) { | ||||
| TriangleDice::SubPatch& sub = subpatches_triangle[i]; | TriangleDice::SubPatch& sub = subpatches_triangle[i]; | ||||
| TriangleDice::EdgeFactors& ef = edgefactors_triangle[i]; | TriangleDice::EdgeFactors& ef = edgefactors_triangle[i]; | ||||
| Show All 37 Lines | void DiagSplit::split_quad(Patch *patch) | ||||
| sub_split.P01 = make_float2(0.0f, 1.0f); | sub_split.P01 = make_float2(0.0f, 1.0f); | ||||
| sub_split.P11 = make_float2(1.0f, 1.0f); | sub_split.P11 = make_float2(1.0f, 1.0f); | ||||
| ef_split.tu0 = T(patch, sub_split.P00, sub_split.P10); | ef_split.tu0 = T(patch, sub_split.P00, sub_split.P10); | ||||
| ef_split.tu1 = T(patch, sub_split.P01, sub_split.P11); | ef_split.tu1 = T(patch, sub_split.P01, sub_split.P11); | ||||
| ef_split.tv0 = T(patch, sub_split.P00, sub_split.P01); | ef_split.tv0 = T(patch, sub_split.P00, sub_split.P01); | ||||
| ef_split.tv1 = T(patch, sub_split.P10, sub_split.P11); | ef_split.tv1 = T(patch, sub_split.P10, sub_split.P11); | ||||
| limit_edge_factors(sub_split, ef_split, 1 << params.max_level); | |||||
| split(sub_split, ef_split); | split(sub_split, ef_split); | ||||
| QuadDice dice(params); | QuadDice dice(params); | ||||
| for(size_t i = 0; i < subpatches_quad.size(); i++) { | for(size_t i = 0; i < subpatches_quad.size(); i++) { | ||||
| QuadDice::SubPatch& sub = subpatches_quad[i]; | QuadDice::SubPatch& sub = subpatches_quad[i]; | ||||
| QuadDice::EdgeFactors& ef = edgefactors_quad[i]; | QuadDice::EdgeFactors& ef = edgefactors_quad[i]; | ||||
| Show All 14 Lines | |||||
Put { on new line to match the coding style convention.