[Bf-blender-cvs] [7383453] cycles-ptex-06: Partial fix for corners, not yet correct in many cases

Nicholas Bishop noreply at git.blender.org
Thu Jan 15 20:13:35 CET 2015


Commit: 7383453cb261d7e4eb8988a7df86111ed6886021
Author: Nicholas Bishop
Date:   Thu Jan 15 19:54:21 2015 +0100
Branches: cycles-ptex-06
https://developer.blender.org/rB7383453cb261d7e4eb8988a7df86111ed6886021

Partial fix for corners, not yet correct in many cases

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

M	intern/cycles/render/image.cpp

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

diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
index d50d594..ecaf3f9 100644
--- a/intern/cycles/render/image.cpp
+++ b/intern/cycles/render/image.cpp
@@ -235,6 +235,77 @@ struct PtexEdgeIter {
 	float2 incr;
 };
 
+static void ptex_average_corner(PtexPtr<PtexTexture> &r,
+								const int start_face_id,
+								Ptex::EdgeId edge_id,
+								void *output)
+{
+	const Ptex::DataType data_type = r->dataType();
+	const int num_channels = r->numChannels();
+	assert(num_channels <= 4);
+
+	/* TODO: handle more than four channels */
+	float accum[4] = {0.0f, 0.0f, 0.0f, 0.0f};
+
+	/* TODO: probably special cases to handle at mesh boundaries?
+	 * Might need to traverse edges in both directions */
+
+	/* TODO: subface corners */
+
+	int face_id = start_face_id;
+	int num_adj = 0;
+	do {
+		float ftexel[4];
+		char texel[sizeof(float) * 4];
+
+		PtexFaceData &data = *r->getData(face_id);
+		const Ptex::FaceInfo &info = r->getFaceInfo(face_id);
+		const Ptex::Res res = data.res();
+		const int u_res = res.u() - 1;
+		const int v_res = res.v() - 1;
+		switch (edge_id) {
+			case Ptex::e_bottom:
+				data.getPixel(0, 0, texel);
+				break;
+			case Ptex::e_right:
+				data.getPixel(u_res, 0, texel);
+				break;
+			case Ptex::e_top:
+				data.getPixel(u_res, v_res, texel);
+				break;
+			case Ptex::e_left:
+				data.getPixel(0, v_res, texel);
+				break;
+		}
+
+		Ptex::ConvertToFloat(ftexel, texel, data_type, num_channels);
+		for (int i = 0; i < 4; i++) {
+			accum[i] += ftexel[i];
+		}
+		num_adj++;
+
+		if (num_adj > 10) {
+			// TODO, code is not yet correct so prevent infinite loops
+			break;
+		}
+
+		/* Move to next face and edge */
+		face_id = info.adjface(edge_id);
+		edge_id = (Ptex::EdgeId)(((int)info.adjedge(edge_id) + 1) % 4);
+		
+	} while (face_id != start_face_id && face_id != -1);
+
+	/* Average */
+	const float fac = 1.0f / (float)num_adj;
+	for (int i = 0; i < 4; i++) {
+		accum[i] *= fac;
+	}
+
+	/* Output */
+	Ptex::ConvertFromFloat(output, accum, data_type, num_channels);
+
+}
+
 static void ptex_copy_face_border(PtexPackedTexture::Cursor &cursor,
 								  PtexPtr<PtexTexture> &r,
 								  const int face_id,
@@ -242,8 +313,7 @@ static void ptex_copy_face_border(PtexPackedTexture::Cursor &cursor,
 								  const Ptex::EdgeId edge_id,
 								  const int side_res)
 {
-	// TODO: handle corners correctly, for now just skipping over
-	// them:
+	ptex_average_corner(r, face_id, edge_id, cursor.data());
 	cursor.step();
 
 	/* In general there is only one adjacent face, but when a quad is




More information about the Bf-blender-cvs mailing list