Commit: a39a459a1ecbe3ab0cb772b9eae58ffc0a4d3e08 Author: Clément Foucault Date: Tue Feb 7 20:43:58 2017 +0100 Branches: temp-blender2.8-stable https://developer.blender.org/rBa39a459a1ecbe3ab0cb772b9eae58ffc0a4d3e08
OpenGL immediate mode: interface_draw.c (cont) ui_draw_but_UNITVEC Introduced a new shader to be used for simple lighting. =================================================================== M source/blender/editors/interface/interface_draw.c M source/blender/gpu/CMakeLists.txt M source/blender/gpu/GPU_shader.h M source/blender/gpu/gawain/immediate.c M source/blender/gpu/gawain/immediate.h M source/blender/gpu/intern/gpu_shader.c M source/blender/gpu/shaders/gpu_shader_3D_vert.glsl A source/blender/gpu/shaders/gpu_shader_simple_lighting_frag.glsl =================================================================== diff --git a/source/blender/editors/interface/interface_draw.c b/source/blender/editors/interface/interface_draw.c index 7a12be93c7..32df2aaebb 100644 --- a/source/blender/editors/interface/interface_draw.c +++ b/source/blender/editors/interface/interface_draw.c @@ -1280,81 +1280,123 @@ void ui_draw_but_COLORBAND(uiBut *but, uiWidgetColors *UNUSED(wcol), const rcti immUnbindProgram(); } +#define SPHERE_LAT_RES 24 +#define SPHERE_LON_RES 32 + +static float sphere_coords[SPHERE_LON_RES][SPHERE_LAT_RES][3] = {{{2.0f}}}; + +static void ui_draw_lat_lon_vert(unsigned int pos, unsigned int nor, float radius, int lat, int lon) +{ + const float x = sphere_coords[lon][lat][0]; + const float y = sphere_coords[lon][lat][1]; + const float z = sphere_coords[lon][lat][2]; + + immAttrib3f(nor, x, y, z); + immVertex3f(pos, x * radius, y * radius, z * radius); +} + +static void ui_draw_unitvec_sphere(unsigned int pos, unsigned int nor, float radius) +{ + const float lon_inc = 2 * M_PI / SPHERE_LON_RES; + const float lat_inc = M_PI / SPHERE_LAT_RES; + float lon, lat; + + /* TODO put that in a batch */ + + /* Init coords only once */ + if (sphere_coords[0][0][0] == 2.0f) { + lon = 0.0f; + for(int i = 0; i < SPHERE_LON_RES; i++, lon += lon_inc) { + lat = 0.0f; + for(int j = 0; j < SPHERE_LAT_RES; j++, lat += lat_inc) { + sphere_coords[i][j][0] = sinf(lat) * cosf(lon); + sphere_coords[i][j][1] = cosf(lat); + sphere_coords[i][j][2] = sinf(lat) * sinf(lon); + } + } + } + + immBegin(GL_TRIANGLES, (SPHERE_LAT_RES-1) * SPHERE_LON_RES * 6); + for(int i = 0; i < SPHERE_LON_RES; i++) { + for(int j = 0; j < SPHERE_LAT_RES; j++) { + if (j != SPHERE_LAT_RES - 1) { /* Pole */ + ui_draw_lat_lon_vert(pos, nor, radius, j, i); + ui_draw_lat_lon_vert(pos, nor, radius, j+1, i); + ui_draw_lat_lon_vert(pos, nor, radius, j+1, i+1); + } + + if (j != 0) { /* Pole */ + ui_draw_lat_lon_vert(pos, nor, radius, j, i); + ui_draw_lat_lon_vert(pos, nor, radius, j+1, i+1); + ui_draw_lat_lon_vert(pos, nor, radius, j, i+1); + } + } + } + immEnd(); +} +#undef SPHERE_LAT_RES +#undef SPHERE_LON_RES + void ui_draw_but_UNITVEC(uiBut *but, uiWidgetColors *wcol, const rcti *rect) { - static GLuint displist = 0; + /* sphere color */ float diffuse[3] = {1.0f, 1.0f, 1.0f}; + float light[3]; float size; /* backdrop */ UI_draw_roundbox_corner_set(UI_CNR_ALL); UI_draw_roundbox_gl_mode_3ubAlpha(GL_TRIANGLE_FAN, rect->xmin, rect->ymin, rect->xmax, rect->ymax, 5.0f, (unsigned char *)wcol->inner, 255); - /* sphere color */ glCullFace(GL_BACK); glEnable(GL_CULL_FACE); /* setup lights */ - GPULightData light = {0}; - light.type = GPU_LIGHT_SUN; - copy_v3_v3(light.diffuse, diffuse); - zero_v3(light.specular); - ui_but_v3_get(but, light.direction); + ui_but_v3_get(but, light); + light[2] = -light[2]; - GPU_basic_shader_light_set(0, &light); - for (int a = 1; a < 8; a++) - GPU_basic_shader_light_set(a, NULL); - - /* setup shader */ - GPU_basic_shader_colors(diffuse, NULL, 0, 1.0f); - GPU_basic_shader_bind(GPU_SHADER_LIGHTING); + VertexFormat *format = immVertexFormat(); + unsigned int pos = add_attrib(format, "pos", GL_FLOAT, 3, KEEP_FLOAT); + unsigned int nor = add_attrib(format, "nor", GL_FLOAT, 3, KEEP_FLOAT); + immBindBuiltinProgram(GPU_SHADER_SIMPLE_LIGHTING); + immUniformColor3fv(diffuse); + immUniform3fv("light", light); /* transform to button */ - glPushMatrix(); - glTranslatef(rect->xmin + 0.5f * BLI_rcti_size_x(rect), rect->ymin + 0.5f * BLI_rcti_size_y(rect), 0.0f); + gpuMatrixBegin3D_legacy(); + gpuPushMatrix(); if (BLI_rcti_size_x(rect) < BLI_rcti_size_y(rect)) size = BLI_rcti_size_x(rect) / 200.f; else size = BLI_rcti_size_y(rect) / 200.f; - glScalef(size, size, MIN2(size, 1.0f)); - - if (displist == 0) { - GLUquadricObj *qobj; - - displist = glGenLists(1); - glNewList(displist, GL_COMPILE); - - qobj = gluNewQuadric(); - gluQuadricDrawStyle(qobj, GLU_FILL); - GPU_basic_shader_bind(GPU_basic_shader_bound_options()); - gluSphere(qobj, 100.0, 32, 24); - gluDeleteQuadric(qobj); - - glEndList(); - } + gpuTranslate3f(rect->xmin + 0.5f * BLI_rcti_size_x(rect), rect->ymin + 0.5f * BLI_rcti_size_y(rect), 0.0f); + gpuScale3f(size, size, MIN2(size, 1.0f)); - glCallList(displist); + ui_draw_unitvec_sphere(pos, nor, 100.0); + immUnbindProgram(); /* restore */ - GPU_basic_shader_bind(GPU_SHADER_USE_COLOR); - GPU_default_lights(); glDisable(GL_CULL_FACE); /* AA circle */ + format = immVertexFormat(); + pos = add_attrib(format, "pos", GL_FLOAT, 2, KEEP_FLOAT); + immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); + immUniformColor3ubv((unsigned char *)wcol->inner); + glEnable(GL_BLEND); glEnable(GL_LINE_SMOOTH); - glColor3ubv((unsigned char *)wcol->inner); - glutil_draw_lined_arc(0.0f, M_PI * 2.0, 100.0f, 32); + imm_draw_lined_circle(pos, 0.0f, 0.0f, 100.0f, 32); glDisable(GL_BLEND); glDisable(GL_LINE_SMOOTH); /* matrix after circle */ - glPopMatrix(); + gpuPopMatrix(); + gpuMatrixEnd(); - /* We disabled all blender lights above, so restore them here. */ - GPU_default_lights(); + immUnbindProgram(); } static void ui_draw_but_curve_grid(const rcti *rect, float zoomx, float zoomy, float offsx, float offsy, float step) diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt index e8d23c7d3f..a2cf143bb0 100644 --- a/source/blender/gpu/CMakeLists.txt +++ b/source/blender/gpu/CMakeLists.txt @@ -131,6 +131,7 @@ set(SRC data_to_c_simple(shaders/gpu_shader_depth_only_frag.glsl SRC) data_to_c_simple(shaders/gpu_shader_uniform_color_frag.glsl SRC) data_to_c_simple(shaders/gpu_shader_checker_frag.glsl SRC) +data_to_c_simple(shaders/gpu_shader_simple_lighting_frag.glsl SRC) data_to_c_simple(shaders/gpu_shader_flat_color_frag.glsl SRC) data_to_c_simple(shaders/gpu_shader_flat_color_alpha_test_0_frag.glsl SRC) data_to_c_simple(shaders/gpu_shader_2D_vert.glsl SRC) diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h index 7b9a3e0963..f130dcc8c6 100644 --- a/source/blender/gpu/GPU_shader.h +++ b/source/blender/gpu/GPU_shader.h @@ -97,6 +97,7 @@ typedef enum GPUBuiltinShader { GPU_SHADER_EDGES_FRONT_BACK_ORTHO, GPU_SHADER_EDGES_OVERLAY_SIMPLE, GPU_SHADER_EDGES_OVERLAY, + GPU_SHADER_SIMPLE_LIGHTING, /* for simple 2D drawing */ GPU_SHADER_2D_UNIFORM_COLOR, GPU_SHADER_2D_FLAT_COLOR, diff --git a/source/blender/gpu/gawain/immediate.c b/source/blender/gpu/gawain/immediate.c index 03e16ca248..d96fc6f938 100644 --- a/source/blender/gpu/gawain/immediate.c +++ b/source/blender/gpu/gawain/immediate.c @@ -727,6 +727,28 @@ void immUniform1f(const char* name, float x) glUniform1f(loc, x); } +void immUniform3f(const char* name, float x, float y, float z) + { + int loc = glGetUniformLocation(imm.bound_program, name); + +#if TRUST_NO_ONE + assert(loc != -1); +#endif + + glUniform3f(loc, x, y, z); + } + +void immUniform3fv(const char* name, const float data[3]) + { + int loc = glGetUniformLocation(imm.bound_program, name); + +#if TRUST_NO_ONE + assert(loc != -1); +#endif + + glUniform3fv(loc, 1, data); + } + void immUniform4f(const char* name, float x, float y, float z, float w) { int loc = glGetUniformLocation(imm.bound_program, name); diff --git a/source/blender/gpu/gawain/immediate.h b/source/blender/gpu/gawain/immediate.h index 50965d3d36..d8d6949d47 100644 --- a/source/blender/gpu/gawain/immediate.h +++ b/source/blender/gpu/gawain/immediate.h @@ -79,6 +79,8 @@ void immVertex2iv(unsigned attrib_id, const int data[2]); // provide uniform values that don't change for the entire draw call void immUniform1i(const char* name, int x); void immUniform1f(const char* name, float x); +void immUniform3f(const char* name, float x, float y, float z); +void immUniform3fv(const char* name, const float data[3]); void immUniform4f(const char* name, float x, float y, float z, float w); void immUniform4fv(const char* name, const float data[4]); diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c index 5160a33bef..8ff312385c 100644 --- a/source/blender/gpu/intern/gpu_shader.c +++ b/source/blender/gpu/intern/gpu_shader.c @@ -49,6 +49,7 @@ extern char datatoc_gpu_shader_depth_only_frag_glsl[]; extern char datatoc_gpu_shader_uniform_color_frag_glsl[]; extern char datatoc_gpu_shader_checker_frag_glsl[]; +extern char datatoc_gpu_shader_simple_lighting_frag_glsl[]; extern char datatoc_gpu_shader_flat_color_frag_glsl[]; extern char datatoc_gpu_shader_flat_color_alpha_test_0_frag_glsl[]; extern char datatoc_gpu_shader_2D_vert_glsl[]; @@ -625,6 +626,7 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader) [GPU_SHADER_EDGES_OVERLAY] = { datatoc_gpu_shader_edges_overlay_vert_glsl, datatoc_gpu_shader_edges_overlay_frag_glsl, datatoc_gpu_shader_edges_overlay_geom_glsl }, + [GPU_SHADER_SIMPLE_LIGHTING] = { datatoc_gpu_shader_3D_vert_glsl, datatoc_gpu_shader_simple_lighting_frag_glsl }, [GPU_SHADER_2D_IMAGE_MASK_UNIFORM_COLOR] = { datatoc_gpu_shader_3D_image_vert_glsl, datatoc_gpu_shader_image_mask_uniform_color_frag_glsl }, @@ -686,7 +688,8 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader) if (builtin_shaders[shader] == NULL) { /* just a few special cases */ - const char *defines = (shader == GPU_SHADER_SMOKE_COBA) ? "#define USE_COBA;\n" : NULL; + const char *defines = (shader == GPU_SHADER_SMOKE_COBA) ? "#define USE_COBA;\n" : + (shader == GPU_SHADER_SIMPLE_LIGHTING) ? "#define USE_NORMALS;\n" : NULL; const GPUShaderStages *stages = builtin_shader_stages + shader; @@ -698,6 +701,14 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader) stages = &legacy_fancy_edges; } + if (shader == GPU_SHADER_EDGES_FRONT_BACK_PERSP && !GLEW_VERSION_3_2) { + /* TODO: remove after switch to core profile (maybe) */ + static const GPUShaderStages legacy_fancy_edges = + { datatoc_gpu_shader_edges_front_back_persp_legacy_vert_glsl, + datatoc_gpu_shader_flat_color_alpha_test_0_frag_glsl }; + stag @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs