diff options
Diffstat (limited to 'intern/cycles/subd')
-rw-r--r-- | intern/cycles/subd/subd_dice.cpp | 22 | ||||
-rw-r--r-- | intern/cycles/subd/subd_dice.h | 4 | ||||
-rw-r--r-- | intern/cycles/subd/subd_patch.h | 1 |
3 files changed, 26 insertions, 1 deletions
diff --git a/intern/cycles/subd/subd_dice.cpp b/intern/cycles/subd/subd_dice.cpp index f77df388c87..05ff5ca4b65 100644 --- a/intern/cycles/subd/subd_dice.cpp +++ b/intern/cycles/subd/subd_dice.cpp @@ -34,6 +34,11 @@ EdgeDice::EdgeDice(const SubdParams& params_) vert_offset = 0; params.mesh->attributes.add(ATTR_STD_VERTEX_NORMAL); + + if(params.ptex) { + params.mesh->attributes.add(ATTR_STD_PTEX_UV); + params.mesh->attributes.add(ATTR_STD_PTEX_FACE_ID); + } } void EdgeDice::reserve(int num_verts, int num_tris) @@ -63,12 +68,29 @@ int EdgeDice::add_vert(Patch *patch, float2 uv) mesh_P[vert_offset] = P; mesh_N[vert_offset] = N; + if(params.ptex) { + Attribute *attr_ptex_uv = params.mesh->attributes.add(ATTR_STD_PTEX_UV); + params.mesh->attributes.reserve(); + + float3 *ptex_uv = attr_ptex_uv->data_float3(); + ptex_uv[vert_offset] = make_float3(uv.x, uv.y, 0.0f); + } + return vert_offset++; } void EdgeDice::add_triangle(Patch *patch, int v0, int v1, int v2) { params.mesh->add_triangle(v0, v1, v2, params.shader, params.smooth); + + if(params.ptex) { + Attribute *attr_ptex_face_id = params.mesh->attributes.add(ATTR_STD_PTEX_FACE_ID); + params.mesh->attributes.reserve(); + + float *ptex_face_id = attr_ptex_face_id->data_float(); + ptex_face_id[tri_offset] = (float)patch->ptex_face_id(); + } + tri_offset++; } diff --git a/intern/cycles/subd/subd_dice.h b/intern/cycles/subd/subd_dice.h index 037b17bbfc8..9cf5b0d50b8 100644 --- a/intern/cycles/subd/subd_dice.h +++ b/intern/cycles/subd/subd_dice.h @@ -35,17 +35,19 @@ struct SubdParams { Mesh *mesh; int shader; bool smooth; + bool ptex; int test_steps; int split_threshold; float dicing_rate; Camera *camera; - SubdParams(Mesh *mesh_, int shader_, bool smooth_ = true) + SubdParams(Mesh *mesh_, int shader_, bool smooth_ = true, bool ptex_ = false) { mesh = mesh_; shader = shader_; smooth = smooth_; + ptex = ptex_; test_steps = 3; split_threshold = 1; diff --git a/intern/cycles/subd/subd_patch.h b/intern/cycles/subd/subd_patch.h index b851fef16ae..48f35d78711 100644 --- a/intern/cycles/subd/subd_patch.h +++ b/intern/cycles/subd/subd_patch.h @@ -28,6 +28,7 @@ public: virtual void eval(float3 *P, float3 *dPdu, float3 *dPdv, float u, float v) = 0; virtual bool is_triangle() { return false; } virtual BoundBox bound() = 0; + virtual int ptex_face_id() { return -1; } }; /* Linear Quad Patch */ |