[Bf-blender-cvs] [762db91] temp-cycles-microdisplacement: Add max subdivision setting to subdivision meshes

Mai Lavelle noreply at git.blender.org
Tue Apr 12 18:45:46 CEST 2016


Commit: 762db91439723f9c8eca0ebb99859517c13a051b
Author: Mai Lavelle
Date:   Fri Mar 25 21:21:07 2016 -0400
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rB762db91439723f9c8eca0ebb99859517c13a051b

Add max subdivision setting to subdivision meshes

===================================================================

M	intern/cycles/blender/addon/properties.py
M	intern/cycles/blender/addon/ui.py
M	intern/cycles/blender/blender_mesh.cpp
M	intern/cycles/subd/subd_dice.h
M	intern/cycles/subd/subd_split.cpp

===================================================================

diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py
index 060c6ed..de9481e 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -966,6 +966,12 @@ class CyclesMeshSettings(bpy.types.PropertyGroup):
                 description="Use subdivision in preview render",
                 default=True,
                 )
+        cls.max_subdivision_level = IntProperty(
+                name="Max Subdivision Level",
+                description="",
+                min=0, max=16,
+                default=12,
+                )
 
     @classmethod
     def unregister(cls):
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index df638fb..e3c4f21 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -700,6 +700,8 @@ class Cycles_PT_mesh_displacement(CyclesButtonsPanel, Panel):
             preview_sub = sub.row(align=True)
             preview_sub.prop(cdata, "preview_dicing_rate", text="Preview")
             preview_sub.prop(cdata, "preview_displacement", text="", icon="RESTRICT_VIEW_OFF")
+            sub.separator()
+            sub.prop(cdata, "max_subdivision_level")
 
 class CyclesObject_PT_motion_blur(CyclesButtonsPanel, Panel):
     bl_label = "Motion Blur"
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 07b2e68..e2477ee 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -668,6 +668,7 @@ static void create_subd_mesh(Scene *scene,
 
 	SubdParams sdparams(mesh, used_shaders[0], true, false);
 	sdparams.dicing_rate = preview ? RNA_float_get(cmesh, "preview_dicing_rate") : RNA_float_get(cmesh, "dicing_rate");
+	sdparams.max_level = RNA_int_get(cmesh, "max_subdivision_level");
 
 	scene->camera->update();
 	sdparams.camera = scene->camera;
diff --git a/intern/cycles/subd/subd_dice.h b/intern/cycles/subd/subd_dice.h
index 2b11e4b..8450a43 100644
--- a/intern/cycles/subd/subd_dice.h
+++ b/intern/cycles/subd/subd_dice.h
@@ -40,6 +40,7 @@ struct SubdParams {
 	int test_steps;
 	int split_threshold;
 	float dicing_rate;
+	int max_level;
 	Camera *camera;
 	Transform objecttoworld;
 
@@ -53,6 +54,7 @@ struct SubdParams {
 		test_steps = 3;
 		split_threshold = 1;
 		dicing_rate = 0.1f;
+		max_level = 12;
 		camera = NULL;
 	}
 
diff --git a/intern/cycles/subd/subd_split.cpp b/intern/cycles/subd/subd_split.cpp
index e17b612..de3d5e6 100644
--- a/intern/cycles/subd/subd_split.cpp
+++ b/intern/cycles/subd/subd_split.cpp
@@ -115,6 +115,56 @@ void DiagSplit::partition_edge(Patch *patch, float2 *P, int *t0, int *t1, float2
 	}
 }
 
+static float2 right_to_equilateral(float2 P) {
+	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)
 {
 	if(depth > 32) {
@@ -172,6 +222,10 @@ void DiagSplit::split(TriangleDice::SubPatch& sub, TriangleDice::EdgeFactors& ef
 			QuadDice::SubPatch sub1 = {sub.patch, sub.Pw, Pv, Pu, 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(sub1, ef1, depth+1);
 			split(sub2, ef2, depth+1);
@@ -224,6 +278,9 @@ void DiagSplit::split(QuadDice::SubPatch& sub, QuadDice::EdgeFactors& ef, int de
 		QuadDice::SubPatch sub0 = {sub.patch, sub.P00, Pu0, sub.P01, Pu1};
 		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(sub1, ef1, depth+1);
 	}
@@ -249,6 +306,9 @@ void DiagSplit::split(QuadDice::SubPatch& sub, QuadDice::EdgeFactors& ef, int de
 		QuadDice::SubPatch sub0 = {sub.patch, sub.P00, sub.P10, Pv0, Pv1};
 		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(sub1, ef1, depth+1);
 	}
@@ -271,6 +331,8 @@ void DiagSplit::split_triangle(Patch *patch)
 	ef_split.tv = T(patch, sub_split.Pw, sub_split.Pu);
 	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);
 
 	TriangleDice dice(params);
@@ -324,6 +386,8 @@ void DiagSplit::split_quad(Patch *patch)
 	ef_split.tv0 = T(patch, sub_split.P00, sub_split.P01);
 	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);
 
 	QuadDice dice(params);




More information about the Bf-blender-cvs mailing list