[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