Commit: 08877036168737c0d0cbd25fc1fea651231060c7
Author: Dalai Felinto
Date:   Fri Apr 7 12:33:00 2017 +0200
Branches: custom-manipulators
https://developer.blender.org/rB08877036168737c0d0cbd25fc1fea651231060c7

OpenGL: Port wm_manipulator_geometryinfo_draw

Thanks to Clément Foucault for the help with the Batch API!

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

M       
source/blender/windowmanager/manipulators/intern/manipulator_library/arrow_manipulator.c
M       source/blender/windowmanager/manipulators/intern/wm_manipulator.c
M       source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h

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

diff --git 
a/source/blender/windowmanager/manipulators/intern/manipulator_library/arrow_manipulator.c
 
b/source/blender/windowmanager/manipulators/intern/manipulator_library/arrow_manipulator.c
index b013f9f241b..8236d9950a2 100644
--- 
a/source/blender/windowmanager/manipulators/intern/manipulator_library/arrow_manipulator.c
+++ 
b/source/blender/windowmanager/manipulators/intern/manipulator_library/arrow_manipulator.c
@@ -145,7 +145,7 @@ static void arrow_draw_geom(const ArrowManipulator *arrow, 
const bool select, co
        }
        else {
 #ifdef USE_MANIPULATOR_CUSTOM_ARROWS
-               
wm_manipulator_geometryinfo_draw(&wm_manipulator_geom_data_arrow, select);
+               
wm_manipulator_geometryinfo_draw(&wm_manipulator_geom_data_arrow, select, 
color);
 #else
                unsigned int pos = VertexFormat_add_attrib(immVertexFormat(), 
"pos", COMP_F32, 3, KEEP_FLOAT);
 
@@ -182,7 +182,7 @@ static void arrow_draw_geom(const ArrowManipulator *arrow, 
const bool select, co
 
                        /* draw cube */
                        immUnbindProgram();
-                       
wm_manipulator_geometryinfo_draw(&wm_manipulator_geom_data_cube, select);
+                       
wm_manipulator_geometryinfo_draw(&wm_manipulator_geom_data_cube, select, color);
                }
                else {
                        const float len = 0.25f;
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c 
b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
index d2e748a132c..e059d8f9630 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
@@ -39,6 +39,7 @@
 #include "ED_screen.h"
 #include "ED_view3d.h"
 
+#include "GPU_batch.h"
 #include "GPU_glew.h"
 
 #include "MEM_guardedalloc.h"
@@ -57,53 +58,58 @@
 /**
  * Main draw call for ManipulatorGeomInfo data
  */
-void wm_manipulator_geometryinfo_draw(const ManipulatorGeomInfo *info, const 
bool select)
+void wm_manipulator_geometryinfo_draw(const ManipulatorGeomInfo *info, const 
bool select, const float color[4])
 {
-       GLuint buf[3];
-       const bool use_lighting = !select && ((U.manipulator_flag & 
V3D_SHADED_MANIPULATORS) != 0);
+       /* TODO store the Batches inside the ManipulatorGeomInfo and updated it 
when geom changes
+        * So we don't need to re-created and discard it every time */
 
-       if (use_lighting)
-               glGenBuffers(3, buf);
-       else
-               glGenBuffers(2, buf);
+       const bool use_lighting = true || (!select && ((U.manipulator_flag & 
V3D_SHADED_MANIPULATORS) != 0));
+       VertexBuffer *vbo;
+       ElementList *el;
+       Batch *batch;
+       ElementListBuilder elb = {0};
 
-       glEnableClientState(GL_VERTEX_ARRAY);
-       glBindBuffer(GL_ARRAY_BUFFER, buf[0]);
-       glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 3 * info->nverts, 
info->verts, GL_STATIC_DRAW);
-       glVertexPointer(3, GL_FLOAT, 0, NULL);
+       VertexFormat format = {0};
+       unsigned int pos_id = VertexFormat_add_attrib(&format, "pos", COMP_F32, 
3, KEEP_FLOAT);
+       unsigned int nor_id;
 
        if (use_lighting) {
-               glEnableClientState(GL_NORMAL_ARRAY);
-               glBindBuffer(GL_ARRAY_BUFFER, buf[2]);
-               glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 3 * info->nverts, 
info->normals, GL_STATIC_DRAW);
-               glNormalPointer(GL_FLOAT, 0, NULL);
-               glShadeModel(GL_SMOOTH);
+               nor_id = VertexFormat_add_attrib(&format, "nor", COMP_I16, 3, 
NORMALIZE_INT_TO_FLOAT);
        }
 
-       glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buf[1]);
-       glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned short) * (3 * 
info->ntris), info->indices, GL_STATIC_DRAW);
+       /* Elements */
+       ElementListBuilder_init(&elb, GL_TRIANGLES, info->ntris, info->nverts);
+       for (int i = 0; i < info->ntris; ++i) {
+               const unsigned short *idx = &info->indices[i * 3];
+               add_triangle_vertices(&elb, idx[0], idx[1], idx[2]);
+       }
+       el = ElementList_build(&elb);
+
+       vbo = VertexBuffer_create_with_format(&format);
+       VertexBuffer_allocate_data(vbo, info->nverts);
+
+       VertexBuffer_fill_attrib(vbo, pos_id, info->verts);
+
+       if (use_lighting) {
+               /* Normals are expected to be smooth. */
+               VertexBuffer_fill_attrib(vbo, nor_id, info->normals);
+       }
+
+       batch = Batch_create(GL_TRIANGLES, vbo, el);
+       Batch_set_builtin_program(batch, GPU_SHADER_3D_UNIFORM_COLOR);
+
+       Batch_Uniform4fv(batch, "color", color);
 
        glEnable(GL_CULL_FACE);
        // glEnable(GL_DEPTH_TEST);
 
-       glDrawElements(GL_TRIANGLES, info->ntris * 3, GL_UNSIGNED_SHORT, NULL);
+       Batch_draw(batch);
 
        glDisable(GL_DEPTH_TEST);
        // glDisable(GL_CULL_FACE);
 
-       glBindBuffer(GL_ARRAY_BUFFER, 0);
-       glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
-
-       glDisableClientState(GL_VERTEX_ARRAY);
 
-       if (use_lighting) {
-               glDisableClientState(GL_NORMAL_ARRAY);
-               glShadeModel(GL_FLAT);
-               glDeleteBuffers(3, buf);
-       }
-       else {
-               glDeleteBuffers(2, buf);
-       }
+       Batch_discard_all(batch);
 }
 
 /* Still unused */
diff --git 
a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h 
b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
index a1ea4bfc8ae..2acc72afc95 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
@@ -218,7 +218,7 @@ bool wm_manipulatormap_deselect_all(struct wmManipulatorMap 
*mmap, struct wmMani
 /* -------------------------------------------------------------------- */
 /* Manipulator drawing */
 
-void wm_manipulator_geometryinfo_draw(const struct ManipulatorGeomInfo *info, 
const bool select);
+void wm_manipulator_geometryinfo_draw(const struct ManipulatorGeomInfo *info, 
const bool select, const float color[4]);
 
 #endif  /* __WM_MANIPULATOR_INTERN_H__ */

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

Reply via email to