Commit: 6a7f6b1ca1e6a52fa81af75ea68ad71351bc058d
Author: Mai Lavelle
Date:   Sun Jan 31 22:03:00 2016 -0500
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rB6a7f6b1ca1e6a52fa81af75ea68ad71351bc058d

Seperate dice and split for subdivision meshes

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

M       intern/cycles/blender/blender_curves.cpp
M       intern/cycles/blender/blender_mesh.cpp
M       intern/cycles/render/CMakeLists.txt
M       intern/cycles/render/mesh.cpp
M       intern/cycles/render/mesh.h
A       intern/cycles/render/mesh_subdivision.cpp
M       intern/cycles/subd/subd_dice.cpp
M       intern/cycles/subd/subd_split.cpp

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

diff --git a/intern/cycles/blender/blender_curves.cpp 
b/intern/cycles/blender/blender_curves.cpp
index 0178bfb..199270f 100644
--- a/intern/cycles/blender/blender_curves.cpp
+++ b/intern/cycles/blender/blender_curves.cpp
@@ -411,7 +411,7 @@ void ExportCurveTrianglePlanes(Mesh *mesh, 
ParticleCurveData *CData,
                }
        }
 
-       mesh->reserve(mesh->verts.size(), mesh->triangles.size(), 0, 0);
+       mesh->reserve(mesh->verts.size(), mesh->triangles.size(), 0, 0, 0);
        mesh->attributes.remove(ATTR_STD_VERTEX_NORMAL);
        mesh->attributes.remove(ATTR_STD_FACE_NORMAL);
        mesh->add_face_normals();
@@ -547,7 +547,7 @@ void ExportCurveTriangleGeometry(Mesh *mesh, 
ParticleCurveData *CData, int resol
                }
        }
 
-       mesh->reserve(mesh->verts.size(), mesh->triangles.size(), 0, 0);
+       mesh->reserve(mesh->verts.size(), mesh->triangles.size(), 0, 0, 0);
        mesh->attributes.remove(ATTR_STD_VERTEX_NORMAL);
        mesh->attributes.remove(ATTR_STD_FACE_NORMAL);
        mesh->add_face_normals();
diff --git a/intern/cycles/blender/blender_mesh.cpp 
b/intern/cycles/blender/blender_mesh.cpp
index e2477ee..b075bfb 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -532,12 +532,13 @@ static void attr_create_pointiness(Scene *scene,
 static void create_mesh(Scene *scene,
                         Mesh *mesh,
                         BL::Mesh& b_mesh,
-                        const vector<uint>& used_shaders)
+                        const vector<uint>& used_shaders,
+                        bool subdivision=false)
 {
        /* count vertices and faces */
        int numverts = b_mesh.vertices.length();
        int numfaces = b_mesh.tessfaces.length();
-       int numtris = 0;
+       int numtris = 0, numpatches = 0;
        bool use_loop_normals = b_mesh.use_auto_smooth();
 
        BL::Mesh::vertices_iterator v;
@@ -545,11 +546,14 @@ static void create_mesh(Scene *scene,
 
        for(b_mesh.tessfaces.begin(f); f != b_mesh.tessfaces.end(); ++f) {
                int4 vi = get_int4(f->vertices_raw());
-               numtris += (vi[3] == 0)? 1: 2;
+               if(!subdivision)
+                       numtris += (vi[3] == 0)? 1: 2;
+               else
+                       numpatches++;
        }
 
        /* reserve memory */
-       mesh->reserve(numverts, numtris, 0, 0);
+       mesh->reserve(numverts, numtris, 0, 0, numpatches);
 
        /* create vertex coordinates and normals */
        int i = 0;
@@ -613,24 +617,33 @@ static void create_mesh(Scene *scene,
                        }
                }
 
-               /* create triangles */
-               if(n == 4) {
-                       if(is_zero(cross(mesh->verts[vi[1]] - 
mesh->verts[vi[0]], mesh->verts[vi[2]] - mesh->verts[vi[0]])) ||
-                          is_zero(cross(mesh->verts[vi[2]] - 
mesh->verts[vi[0]], mesh->verts[vi[3]] - mesh->verts[vi[0]])))
-                       {
-                               // TODO(mai): order here is probably wrong
-                               mesh->set_triangle(ti++, vi[0], vi[1], vi[3], 
shader, smooth, true);
-                               mesh->set_triangle(ti++, vi[2], vi[3], vi[1], 
shader, smooth, true);
-                               face_flags[fi] |= FACE_FLAG_DIVIDE_24;
-                       }
-                       else {
-                               mesh->set_triangle(ti++, vi[0], vi[1], vi[2], 
shader, smooth, true);
-                               mesh->set_triangle(ti++, vi[0], vi[2], vi[3], 
shader, smooth, true);
-                               face_flags[fi] |= FACE_FLAG_DIVIDE_13;
+               if(!subdivision) {
+                       /* create triangles */
+                       if(n == 4) {
+                               if(is_zero(cross(mesh->verts[vi[1]] - 
mesh->verts[vi[0]], mesh->verts[vi[2]] - mesh->verts[vi[0]])) ||
+                                  is_zero(cross(mesh->verts[vi[2]] - 
mesh->verts[vi[0]], mesh->verts[vi[3]] - mesh->verts[vi[0]])))
+                               {
+                                       // TODO(mai): order here is probably 
wrong
+                                       mesh->set_triangle(ti++, vi[0], vi[1], 
vi[3], shader, smooth, true);
+                                       mesh->set_triangle(ti++, vi[2], vi[3], 
vi[1], shader, smooth, true);
+                                       face_flags[fi] |= FACE_FLAG_DIVIDE_24;
+                               }
+                               else {
+                                       mesh->set_triangle(ti++, vi[0], vi[1], 
vi[2], shader, smooth, true);
+                                       mesh->set_triangle(ti++, vi[0], vi[2], 
vi[3], shader, smooth, true);
+                                       face_flags[fi] |= FACE_FLAG_DIVIDE_13;
+                               }
                        }
+                       else
+                               mesh->set_triangle(ti++, vi[0], vi[1], vi[2], 
shader, smooth, false);
+               }
+               else {
+                       /* create patches */
+                       if(n == 4)
+                               mesh->set_patch(ti++, vi[0], vi[1], vi[2], 
vi[3], shader, smooth);
+                       else
+                               mesh->set_patch(ti++, vi[0], vi[1], vi[2], -1, 
shader, smooth);
                }
-               else
-                       mesh->set_triangle(ti++, vi[0], vi[1], vi[2], shader, 
smooth, false);
 
                nverts[fi] = n;
        }
@@ -664,7 +677,7 @@ static void create_subd_mesh(Scene *scene,
                              bool preview)
 {
        Mesh *basemesh = new Mesh();
-       create_mesh(scene, basemesh, b_mesh, used_shaders);
+       create_mesh(scene, basemesh, b_mesh, used_shaders, true);
 
        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");
@@ -767,6 +780,8 @@ Mesh *BlenderSync::sync_mesh(BL::Object& b_ob,
         * adjustments in dynamic BVH - other methods could probably do this 
better*/
        vector<float4> oldcurve_keys = mesh->curve_keys;
 
+       vector<Mesh::SubPatch> oldsubpatches = mesh->subpatches;
+
        mesh->clear();
        mesh->used_shaders = used_shaders;
        mesh->name = ustring(b_ob_data.name().c_str());
@@ -843,6 +858,17 @@ Mesh *BlenderSync::sync_mesh(BL::Object& b_ob,
                if(memcmp(&oldcurve_keys[0], &mesh->curve_keys[0], 
sizeof(float4)*oldcurve_keys.size()) != 0)
                        rebuild = true;
        }
+
+       if(oldsubpatches.size() != mesh->subpatches.size())
+               rebuild = true;
+       else if(oldsubpatches.size()) {
+               for(int i = 0; i < oldsubpatches.size(); i++) {
+                       if(oldsubpatches[i] != mesh->subpatches[i]) {
+                               rebuild = true;
+                               break;
+                       }
+               }
+       }
        
        mesh->tag_update(scene, rebuild);
 
diff --git a/intern/cycles/render/CMakeLists.txt 
b/intern/cycles/render/CMakeLists.txt
index 17ca6ce..ab0e571 100644
--- a/intern/cycles/render/CMakeLists.txt
+++ b/intern/cycles/render/CMakeLists.txt
@@ -27,6 +27,7 @@ set(SRC
        light.cpp
        mesh.cpp
        mesh_displace.cpp
+       mesh_subdivision.cpp
        nodes.cpp
        object.cpp
        osl.cpp
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 681ab68..aa862d1 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -35,9 +35,6 @@
 #include "util_progress.h"
 #include "util_set.h"
 
-#include "../subd/subd_split.h"
-#include "../subd/subd_patch.h"
-
 CCL_NAMESPACE_BEGIN
 
 /* Triangle */
@@ -110,7 +107,7 @@ Mesh::~Mesh()
        delete bvh;
 }
 
-void Mesh::reserve(int numverts, int numtris, int numcurves, int numcurvekeys)
+void Mesh::reserve(int numverts, int numtris, int numcurves, int numcurvekeys, 
int numpatches)
 {
        /* reserve space to add verts and triangles later */
        verts.resize(numverts);
@@ -123,6 +120,8 @@ void Mesh::reserve(int numverts, int numtris, int 
numcurves, int numcurvekeys)
        curve_keys.resize(numcurvekeys);
        curves.resize(numcurves);
 
+       patches.resize(numpatches);
+
        attributes.reserve();
        curve_attributes.reserve();
 }
@@ -140,6 +139,8 @@ void Mesh::clear()
        curve_keys.clear();
        curves.clear();
 
+       patches.clear();
+
        attributes.clear();
        curve_attributes.clear();
        used_shaders.clear();
@@ -210,6 +211,19 @@ void Mesh::add_curve(int first_key, int num_keys, int 
shader)
        curves.push_back(curve);
 }
 
+void Mesh::set_patch(int i, int v0, int v1, int v2, int v3, int shader, bool 
smooth)
+{
+       Patch patch;
+       patch.v[0] = v0;
+       patch.v[1] = v1;
+       patch.v[2] = v2;
+       patch.v[3] = v3;
+       patch.shader = shader;
+       patch.smooth = smooth;
+
+       patches[i] = patch;
+}
+
 void Mesh::compute_bounds()
 {
        BoundBox bnds = BoundBox::empty;
@@ -1449,75 +1463,5 @@ bool Mesh::need_attribute(Scene *scene, ustring name)
        return false;
 }
 
-void Mesh::tessellate(DiagSplit *split)
-{
-       int num_faces = triangles.size();
-
-       add_face_normals();
-
-       Attribute *attr_vF = attributes.find(ATTR_STD_FACE_NORMAL);
-       float3 *vF = attr_vF->data_float3();
-
-       Attribute *attr_vN = attributes.find(ATTR_STD_VERTEX_NORMAL);
-       float3 *vN = attr_vN->data_float3();
-
-       for(int f = 0; f < num_faces; f++) {
-               if(!forms_quad[f]) {
-                       /* triangle */
-                       LinearTrianglePatch* patch = new LinearTrianglePatch();
-                       float3 *hull = patch->hull;
-                       float3 *normals = patch->normals;
-
-                       for(int i = 0; i < 3; i++) {
-                               hull[i] = verts[triangles[f].v[i]];
-                       }
-
-                       if(smooth[f]) {
-                               for(int i = 0; i < 3; i++) {
-                                       normals[i] = vN[triangles[f].v[i]];
-                               }
-                       }
-                       else {
-                               for(int i = 0; i < 3; i++) {
-                                       normals[i] = vF[f];
-                               }
-                       }
-
-                       split->split_triangle(patch);
-                       delete patch;
-               }
-               else {
-                       /* quad */
-                       LinearQuadPatch* patch = new LinearQuadPatch();
-                       float3 *hull = patch->hull;
-                       float3 *normals = patch->normals;
-
-                       hull[0] = verts[triangles[f  ].v[0]];
-                       hull[1] = verts[triangles[f  ].v[1]];
-                       hull[3] = verts[triangles[f  ].v[2]];
-                       hull[2] = verts[triangles[f+1].v[2]];
-
-                       if(smooth[f]) {
-                               normals[0] = vN[triangles[f  ].v[0]];
-                               normals[1] = vN[triangles[f  ].v[1]];
-                               normals[3] = vN[triangles[f  ].v[2]];
-                               normals[2] = vN[triangles[f+1].v[2]];
-                       }
-                       else {
-                               for(int i = 0; i < 4; i++) {
-                                       normals[i] = vF[f];
-                               }
-                       }
-
-                       split->split_quad(patch);
-                       delete patch;
-
-                       // consume second triangle in quad
-                       f++;
-               }
-
-       }
-}
-
 CCL_NAMESPACE_END
 
diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h
index 29a613d..188fedd 100644
--- a/intern/cycles/render/mesh.h
+++ b/intern/cycles/render/mesh.h
@@ -63,6 +63,37 @@ public:
                void bounds_grow(const int k, const float4 *curve_keys, 
BoundBox& bounds) const;
        };
 
+       /* Mesh Patch */
+       struct Patch {
+               int v[4]; /* v[3] is -1 if triangle patch */
+               uint shader;
+               bool smooth;
+
+               bool is_quad() { return v[3] != -1; }
+       };
+
+       struct SubPatch {
+               int patch;
+               int edge_factors[4];
+               float2 uv[4];
+
+               bool is_quad() const { return edge_factors[3] != -1; }
+
+               bool operator == (const SubPatch& other) const
+               {
+                       if(patch != other.patch)
+                               return false;
+
+                       for(int i = 0; i < 4; i++) {
+                               if((edge_factors[i] != other.edge_factors[i]) 
|| (uv[i] != other.uv[i]))
+                                       return false;
+                       }
+
+                       return true;
+               }
+               bool operator != (const SubPatch& other) const { return !(*this 
== other); }
+       };
+
        /* Displacement */
        enum DisplacementMethod {
                DISPLACE_BUMP = 0,
@@ -95,6 +126,9 @@ public:
        vector<float4> curve_keys; /* co + radius */
        vector<Curve> curves;
 
+       vector<Patch> patches;
+       vector<SubPatch> subpatches;
+
        vec

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to