[Bf-blender-cvs] [6a7f6b1] temp-cycles-microdisplacement: Seperate dice and split for subdivision meshes
Mai Lavelle
noreply at git.blender.org
Mon Apr 11 14:54:27 CEST 2016
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. @@
More information about the Bf-blender-cvs
mailing list