[Bf-blender-cvs] [eec09a1] temp-cycles-microdisplacement: Pack patch info into triangle data

Mai Lavelle noreply at git.blender.org
Thu Jun 9 12:11:32 CEST 2016


Commit: eec09a147055805a3c31f878a8fabf6289edb5aa
Author: Mai Lavelle
Date:   Wed Jun 8 03:23:07 2016 -0400
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rBeec09a147055805a3c31f878a8fabf6289edb5aa

Pack patch info into triangle data

Pack data for finding the originating patch of a triangle into unused bytes
in __tri_verts, __tri_vnormal and __tri_vindex. Since these bytes weren't
being used there's no increase in memory usage and we avoid more complicated
logic that would be necessary if this data was stored in attributes.

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

M	intern/cycles/render/mesh.cpp
M	intern/cycles/render/mesh.h
M	intern/cycles/subd/subd_dice.cpp
M	intern/cycles/subd/subd_patch.h

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

diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 1db3dff..f2722c6 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -151,6 +151,11 @@ void Mesh::resize_mesh(int numverts, int numtris)
 	shader.resize(numtris);
 	smooth.resize(numtris);
 
+	if(patches.size()) {
+		triangle_patch.resize(numtris);
+		vert_patch_uv.resize(numverts);
+	}
+
 	attributes.resize();
 }
 
@@ -162,6 +167,11 @@ void Mesh::reserve_mesh(int numverts, int numtris)
 	shader.reserve(numtris);
 	smooth.reserve(numtris);
 
+	if(patches.size()) {
+		triangle_patch.reserve(numtris);
+		vert_patch_uv.reserve(numverts);
+	}
+
 	attributes.resize(true);
 }
 
@@ -203,6 +213,9 @@ void Mesh::clear()
 	shader.clear();
 	smooth.clear();
 
+	triangle_patch.clear();
+	vert_patch_uv.clear();
+
 	curve_keys.clear();
 	curve_radius.clear();
 	curve_first_key.clear();
@@ -253,6 +266,10 @@ void Mesh::add_triangle(int v0, int v1, int v2, int shader_, bool smooth_)
 	triangles.push_back_reserved(v2);
 	shader.push_back_reserved(shader_);
 	smooth.push_back_reserved(smooth_);
+
+	if(patches.size()) {
+		triangle_patch.push_back_reserved(-1);
+	}
 }
 
 void Mesh::add_curve_key(float3 co, float radius)
@@ -494,7 +511,9 @@ void Mesh::pack_normals(Scene *scene, uint *tri_shader, float4 *vnormal)
 		if(do_transform)
 			vNi = normalize(transform_direction(&ntfm, vNi));
 
-		vnormal[i] = make_float4(vNi.x, vNi.y, vNi.z, 0.0f);
+		float patch_v = (!patches.size()) ? 0.0f : vert_patch_uv[i].y;
+
+		vnormal[i] = make_float4(vNi.x, vNi.y, vNi.z, patch_v);
 	}
 }
 
@@ -507,7 +526,9 @@ void Mesh::pack_verts(float4 *tri_verts, float4 *tri_vindex, size_t vert_offset)
 
 		for(size_t i = 0; i < verts_size; i++) {
 			float3 p = verts_ptr[i];
-			tri_verts[i] = make_float4(p.x, p.y, p.z, 0.0f);
+			float patch_u = (!patches.size()) ? 0.0f : vert_patch_uv[i].x;
+
+			tri_verts[i] = make_float4(p.x, p.y, p.z, patch_u);
 		}
 	}
 
@@ -516,12 +537,13 @@ void Mesh::pack_verts(float4 *tri_verts, float4 *tri_vindex, size_t vert_offset)
 	if(triangles_size) {
 		for(size_t i = 0; i < triangles_size; i++) {
 			Triangle t = get_triangle(i);
+			int patch_index = (!patches.size()) ? -1 : triangle_patch[i];
 
 			tri_vindex[i] = make_float4(
 				__int_as_float(t.v[0] + vert_offset),
 				__int_as_float(t.v[1] + vert_offset),
 				__int_as_float(t.v[2] + vert_offset),
-				0);
+				__int_as_float(patch_index));
 		}
 	}
 }
@@ -1526,6 +1548,8 @@ void Mesh::tessellate(DiagSplit *split)
 			float3 *hull = patch.hull;
 			float3 *normals = patch.normals;
 
+			patch.patch_index = f;
+
 			for(int i = 0; i < 3; i++) {
 				hull[i] = verts[p.v[i]];
 			}
@@ -1551,6 +1575,8 @@ void Mesh::tessellate(DiagSplit *split)
 			float3 *hull = patch.hull;
 			float3 *normals = patch.normals;
 
+			patch.patch_index = f;
+
 			for(int i = 0; i < 4; i++) {
 				hull[i] = verts[p.v[i]];
 			}
diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h
index f502037..3cff3e2 100644
--- a/intern/cycles/render/mesh.h
+++ b/intern/cycles/render/mesh.h
@@ -122,6 +122,10 @@ public:
 	array<int> shader;
 	array<bool> smooth;
 
+	/* used for storing patch info for subd triangles, only allocated if there are patches */
+	array<int> triangle_patch; /* mush be < 0 for non subd triangles */
+	array<float2> vert_patch_uv;
+
 	bool has_volume;  /* Set in the device_update_flags(). */
 	bool has_surface_bssrdf;  /* Set in the device_update_flags(). */
 
diff --git a/intern/cycles/subd/subd_dice.cpp b/intern/cycles/subd/subd_dice.cpp
index 21f3243..b3e3f4d 100644
--- a/intern/cycles/subd/subd_dice.cpp
+++ b/intern/cycles/subd/subd_dice.cpp
@@ -66,6 +66,7 @@ int EdgeDice::add_vert(Patch *patch, float2 uv)
 
 	mesh_P[vert_offset] = P;
 	mesh_N[vert_offset] = N;
+	params.mesh->vert_patch_uv[vert_offset] = make_float2(uv.x, uv.y);
 
 	if(params.ptex) {
 		Attribute *attr_ptex_uv = params.mesh->attributes.add(ATTR_STD_PTEX_UV);
@@ -87,6 +88,7 @@ void EdgeDice::add_triangle(Patch *patch, int v0, int v1, int v2)
 		mesh->reserve_mesh(mesh->verts.size(), size_t(max(mesh->num_triangles() + 1, 1) * 1.2));
 
 	mesh->add_triangle(v0, v1, v2, params.shader, params.smooth);
+	params.mesh->triangle_patch[params.mesh->num_triangles()-1] = patch->patch_index;
 
 	if(params.ptex) {
 		Attribute *attr_ptex_face_id = params.mesh->attributes.add(ATTR_STD_PTEX_FACE_ID);
diff --git a/intern/cycles/subd/subd_patch.h b/intern/cycles/subd/subd_patch.h
index bfa0441..0cf930f 100644
--- a/intern/cycles/subd/subd_patch.h
+++ b/intern/cycles/subd/subd_patch.h
@@ -29,6 +29,8 @@ public:
 	virtual bool is_triangle() { return false; }
 	virtual BoundBox bound() = 0;
 	virtual int ptex_face_id() { return -1; }
+
+	int patch_index;
 };
 
 /* Linear Quad Patch */




More information about the Bf-blender-cvs mailing list