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 */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to