[Bf-blender-cvs] [f371e633f94] blender2.8: Curve Batch Cache: Add support for loose edges and curve/surf modifier
Clément Foucault
noreply at git.blender.org
Fri Dec 14 16:36:24 CET 2018
Commit: f371e633f9428e767dce4aab59b5f30c78f2b66f
Author: Clément Foucault
Date: Fri Dec 14 15:23:13 2018 +0100
Branches: blender2.8
https://developer.blender.org/rBf371e633f9428e767dce4aab59b5f30c78f2b66f
Curve Batch Cache: Add support for loose edges and curve/surf modifier
Fixes T58298 Nurbs circle and curve dont draw in objectmode
Fixes T58107 Modified curves/surfaces/fonts do not show their eval mesh
===================================================================
M source/blender/draw/intern/draw_cache.c
M source/blender/draw/intern/draw_cache.h
M source/blender/draw/intern/draw_cache_impl.h
M source/blender/draw/intern/draw_cache_impl_curve.c
M source/blender/draw/intern/draw_cache_impl_mesh.c
M source/blender/draw/modes/object_mode.c
===================================================================
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index 9186191cea5..bbf84d549a2 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -718,8 +718,14 @@ GPUBatch *DRW_cache_object_loose_edges_get(struct Object *ob)
switch (ob->type) {
case OB_MESH:
return DRW_cache_mesh_loose_edges_get(ob);
-
- /* TODO, should match 'DRW_cache_object_surface_get' */
+ case OB_CURVE:
+ return DRW_cache_curve_loose_edges_get(ob);
+ case OB_SURF:
+ return DRW_cache_surf_loose_edges_get(ob);
+ case OB_FONT:
+ return DRW_cache_text_loose_edges_get(ob);
+ case OB_MBALL:
+ /* Cannot have any loose edge */
default:
return NULL;
}
@@ -3227,7 +3233,29 @@ GPUBatch *DRW_cache_curve_surface_get(Object *ob)
BLI_assert(ob->type == OB_CURVE);
struct Curve *cu = ob->data;
- return DRW_curve_batch_cache_get_triangles_with_normals(cu);
+ struct Mesh *mesh_eval = ob->runtime.mesh_eval;
+ if (mesh_eval != NULL) {
+ return DRW_mesh_batch_cache_get_triangles_with_normals(mesh_eval, true);
+ }
+ else {
+ return DRW_curve_batch_cache_get_triangles_with_normals(cu);
+ }
+}
+
+GPUBatch *DRW_cache_curve_loose_edges_get(Object *ob)
+{
+ BLI_assert(ob->type == OB_CURVE);
+
+ struct Curve *cu = ob->data;
+ struct Mesh *mesh_eval = ob->runtime.mesh_eval;
+ if (mesh_eval != NULL) {
+ return DRW_mesh_batch_cache_get_loose_edges_with_normals(mesh_eval);
+ }
+ else {
+ /* TODO */
+ UNUSED_VARS(cu);
+ return NULL;
+ }
}
GPUBatch *DRW_cache_curve_face_wireframe_get(Object *ob)
@@ -3235,7 +3263,13 @@ GPUBatch *DRW_cache_curve_face_wireframe_get(Object *ob)
BLI_assert(ob->type == OB_CURVE);
struct Curve *cu = ob->data;
- return DRW_curve_batch_cache_get_wireframes_face(cu);
+ struct Mesh *mesh_eval = ob->runtime.mesh_eval;
+ if (mesh_eval != NULL) {
+ return DRW_mesh_batch_cache_get_wireframes_face(mesh_eval);
+ }
+ else {
+ return DRW_curve_batch_cache_get_wireframes_face(cu);
+ }
}
/* Return list of batches */
@@ -3245,7 +3279,13 @@ GPUBatch **DRW_cache_curve_surface_shaded_get(
BLI_assert(ob->type == OB_CURVE);
struct Curve *cu = ob->data;
- return DRW_curve_batch_cache_get_surface_shaded(cu, gpumat_array, gpumat_array_len);
+ struct Mesh *mesh_eval = ob->runtime.mesh_eval;
+ if (mesh_eval != NULL) {
+ return DRW_mesh_batch_cache_get_surface_shaded(mesh_eval, gpumat_array, gpumat_array_len, true, NULL, NULL, NULL);
+ }
+ else {
+ return DRW_curve_batch_cache_get_surface_shaded(cu, gpumat_array, gpumat_array_len);
+ }
}
/** \} */
@@ -3294,20 +3334,49 @@ GPUBatch *DRW_cache_text_surface_get(Object *ob)
{
BLI_assert(ob->type == OB_FONT);
struct Curve *cu = ob->data;
+ struct Mesh *mesh_eval = ob->runtime.mesh_eval;
if (cu->editfont && (cu->flag & CU_FAST)) {
return NULL;
}
- return DRW_curve_batch_cache_get_triangles_with_normals(cu);
+ if (mesh_eval != NULL) {
+ return DRW_mesh_batch_cache_get_triangles_with_normals(mesh_eval, true);
+ }
+ else {
+ return DRW_curve_batch_cache_get_triangles_with_normals(cu);
+ }
+}
+
+GPUBatch *DRW_cache_text_loose_edges_get(Object *ob)
+{
+ BLI_assert(ob->type == OB_FONT);
+ struct Curve *cu = ob->data;
+ struct Mesh *mesh_eval = ob->runtime.mesh_eval;
+ if (cu->editfont && (cu->flag & CU_FAST)) {
+ return NULL;
+ }
+ if (mesh_eval != NULL) {
+ return DRW_mesh_batch_cache_get_loose_edges_with_normals(mesh_eval);
+ }
+ else {
+ /* TODO */
+ return NULL;
+ }
}
GPUBatch *DRW_cache_text_face_wireframe_get(Object *ob)
{
BLI_assert(ob->type == OB_FONT);
struct Curve *cu = ob->data;
+ struct Mesh *mesh_eval = ob->runtime.mesh_eval;
if (cu->editfont && (cu->flag & CU_FAST)) {
return NULL;
}
- return DRW_curve_batch_cache_get_wireframes_face(cu);
+ if (mesh_eval != NULL) {
+ return DRW_mesh_batch_cache_get_wireframes_face(mesh_eval);
+ }
+ else {
+ return DRW_curve_batch_cache_get_wireframes_face(cu);
+ }
}
GPUBatch **DRW_cache_text_surface_shaded_get(
@@ -3315,10 +3384,16 @@ GPUBatch **DRW_cache_text_surface_shaded_get(
{
BLI_assert(ob->type == OB_FONT);
struct Curve *cu = ob->data;
+ struct Mesh *mesh_eval = ob->runtime.mesh_eval;
if (cu->editfont && (cu->flag & CU_FAST)) {
return NULL;
}
- return DRW_curve_batch_cache_get_surface_shaded(cu, gpumat_array, gpumat_array_len);
+ if (mesh_eval != NULL) {
+ return DRW_mesh_batch_cache_get_surface_shaded(mesh_eval, gpumat_array, gpumat_array_len, true, NULL, NULL, NULL);
+ }
+ else {
+ return DRW_curve_batch_cache_get_surface_shaded(cu, gpumat_array, gpumat_array_len);
+ }
}
/** \} */
@@ -3333,7 +3408,21 @@ GPUBatch *DRW_cache_surf_surface_get(Object *ob)
BLI_assert(ob->type == OB_SURF);
struct Curve *cu = ob->data;
- return DRW_curve_batch_cache_get_triangles_with_normals(cu);
+ struct Mesh *mesh_eval = ob->runtime.mesh_eval;
+ if (mesh_eval != NULL) {
+ return DRW_mesh_batch_cache_get_triangles_with_normals(mesh_eval, true);
+ }
+ else {
+ return DRW_curve_batch_cache_get_triangles_with_normals(cu);
+ }
+}
+
+GPUBatch *DRW_cache_surf_edge_wire_get(Object *ob)
+{
+ BLI_assert(ob->type == OB_SURF);
+
+ struct Curve *cu = ob->data;
+ return DRW_curve_batch_cache_get_wire_edge(cu);
}
GPUBatch *DRW_cache_surf_face_wireframe_get(Object *ob)
@@ -3341,7 +3430,29 @@ GPUBatch *DRW_cache_surf_face_wireframe_get(Object *ob)
BLI_assert(ob->type == OB_SURF);
struct Curve *cu = ob->data;
- return DRW_curve_batch_cache_get_wireframes_face(cu);
+ struct Mesh *mesh_eval = ob->runtime.mesh_eval;
+ if (mesh_eval != NULL) {
+ return DRW_mesh_batch_cache_get_wireframes_face(mesh_eval);
+ }
+ else {
+ return DRW_curve_batch_cache_get_wireframes_face(cu);
+ }
+}
+
+GPUBatch *DRW_cache_surf_loose_edges_get(Object *ob)
+{
+ BLI_assert(ob->type == OB_SURF);
+
+ struct Curve *cu = ob->data;
+ struct Mesh *mesh_eval = ob->runtime.mesh_eval;
+ if (mesh_eval != NULL) {
+ return DRW_mesh_batch_cache_get_loose_edges_with_normals(mesh_eval);
+ }
+ else {
+ /* TODO */
+ UNUSED_VARS(cu);
+ return NULL;
+ }
}
/* Return list of batches */
@@ -3351,7 +3462,13 @@ GPUBatch **DRW_cache_surf_surface_shaded_get(
BLI_assert(ob->type == OB_SURF);
struct Curve *cu = ob->data;
- return DRW_curve_batch_cache_get_surface_shaded(cu, gpumat_array, gpumat_array_len);
+ struct Mesh *mesh_eval = ob->runtime.mesh_eval;
+ if (mesh_eval != NULL) {
+ return DRW_mesh_batch_cache_get_surface_shaded(mesh_eval, gpumat_array, gpumat_array_len, true, NULL, NULL, NULL);
+ }
+ else {
+ return DRW_curve_batch_cache_get_surface_shaded(cu, gpumat_array, gpumat_array_len);
+ }
}
/** \} */
@@ -3732,13 +3849,17 @@ bool DRW_vbo_requested(GPUVertBuf *vbo)
void drw_batch_cache_generate_requested(Object *ob)
{
+ struct Mesh *mesh_eval = ob->runtime.mesh_eval;
switch (ob->type) {
case OB_MESH:
- DRW_mesh_batch_cache_create_requested(ob);
+ DRW_mesh_batch_cache_create_requested(ob, (Mesh *)ob->data);
break;
case OB_CURVE:
case OB_FONT:
case OB_SURF:
+ if (mesh_eval) {
+ DRW_mesh_batch_cache_create_requested(ob, mesh_eval);
+ }
DRW_curve_batch_cache_create_requested(ob);
break;
/* TODO all cases */
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index 39743b705ae..bfa672ea04c 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -153,6 +153,7 @@ struct GPUBatch *DRW_cache_curve_surface_get(struct Object *ob);
struct GPUBatch **DRW_cache_curve_surface_shaded_get(
struct Object *ob, struct GPUMaterial **gpumat_array, uint gpumat_array_len);
struct GPUBatch *DRW_cache_curve_surface_verts_get(struct Object *ob);
+struct GPUBatch *DRW_cache_curve_loose_edges_get(struct Object *ob);
struct GPUBatch *DRW_cache_curve_edge_wire_get(struct Object *ob);
struct GPUBatch *DRW_cache_curve_face_wireframe_get(Object *ob);
/* edit-mode */
@@ -161,8 +162,9 @@ struct GPUBatch *DRW_cache_curve_edge_overlay_get(struct Object *ob);
struct GPUBatch *DRW_cache_curve_vert_overlay_get(struct Object *ob, bool handles);
/* Font */
-struct GPUBatch *DRW_cache_text_edge_wire_get(struct Object *ob);
struct GPUBatch *DRW_cache_text_surface_get(struct Object *ob);
+struct GPUBatch *DRW_cache_text_loose_edges_get(struct Object *ob);
+struct GPUBatch *DRW_cache_text_edge_wire_get(struct Object *ob);
struct GPUBatch **DRW_cache_text_surface_shaded_get(
struct Object *ob, struct GPUMaterial **gpumat_array, uint gpumat_array_len);
struct GPUBatch *DRW_cache_text_face_wireframe_get(Object *ob);
@@ -172,6 +174,8 @@ struct GPUBatch *DRW_cache_text_select_overlay_get(struct Object *ob);
/* Surface */
struct GPUBatch *DRW_cache_surf_surface_get(struct Object *ob);
+struct GPUBatch *DRW_cache_surf_edge_wire_get(struct Object *ob);
+struct GPUBatch *DRW_cache_surf_loose_edges_get(struct Object *ob);
struct GPUBatch **DRW_cache_surf_surface_shaded_get(
struct Object *ob, struct GPUMaterial **gpumat_array, uint gpumat_array_len);
struct GPUBatch *DRW_cache_surf_face_wireframe_get(Object *ob);
diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h
index 114d694041e..9fef5a78496 100644
--- a/source/blender/draw/intern/draw_cache_impl.h
+++ b/source/blender/draw/intern/draw_cache_impl.h
@@ -119,7 +119,7 @@ void DRW_mesh_weight_state_copy(struct DRW_MeshWeightState *wstate_dst, const st
bool DRW_mesh_weight_state_compare(const struct DRW_MeshWeightState *a, const struct DRW_MeshWeightState *b);
/* Mesh */
-void DRW_mesh_batch_cache_create_requested(struct Object *ob);
+void DRW_mesh_batch_cache_create_requested(struct Object *ob, struct Mesh *me);
struct GPUBatch **DRW_mesh_batch_cache_get_surface_shaded(
struct Mesh *me, struct GPUMaterial **gpumat_array, uint gpumat_array_len, bool use_hide,
diff --git a/source/blender/draw/intern/draw_cache_impl_curve.c b/source/blender/draw/intern/draw_cache_impl_curve.c
index 1d142053126..06aafb547f9 100644
--- a/source/blender/draw/intern/draw_cache_impl_curve.c
+++ b/source/blender/draw/intern/draw_cache_impl_curve.c
@@ -35,7 +35,7 @@
#include "DNA_curve_types.h"
#include "BKE_curve.h"
-
+#include "BKE_displ
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list