forked from bartvdbraak/blender
OpenSubdiv: Support shadeless shading
This commit is contained in:
parent
c967a381fa
commit
988ec3c40c
@ -242,6 +242,7 @@ void main()
|
|||||||
vec3 L_diffuse = vec3(0.0);
|
vec3 L_diffuse = vec3(0.0);
|
||||||
vec3 L_specular = vec3(0.0);
|
vec3 L_specular = vec3(0.0);
|
||||||
|
|
||||||
|
#ifdef USE_LIGHTING
|
||||||
#ifndef USE_COLOR_MATERIAL
|
#ifndef USE_COLOR_MATERIAL
|
||||||
/* Assume NUM_SOLID_LIGHTS directional lights. */
|
/* Assume NUM_SOLID_LIGHTS directional lights. */
|
||||||
for (int i = 0; i < NUM_SOLID_LIGHTS; i++) {
|
for (int i = 0; i < NUM_SOLID_LIGHTS; i++) {
|
||||||
@ -312,6 +313,9 @@ void main()
|
|||||||
L_specular += light_specular * specular_bsdf * intensity;
|
L_specular += light_specular * specular_bsdf * intensity;
|
||||||
}
|
}
|
||||||
#endif /* USE_COLOR_MATERIAL */
|
#endif /* USE_COLOR_MATERIAL */
|
||||||
|
#else /* USE_LIGHTING */
|
||||||
|
L_diffuse = vec3(1.0);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Compute diffuse color. */
|
/* Compute diffuse color. */
|
||||||
#ifdef USE_TEXTURE_2D
|
#ifdef USE_TEXTURE_2D
|
||||||
|
@ -100,6 +100,12 @@ static GLuint g_flat_fill_solid_program = 0;
|
|||||||
static GLuint g_flat_fill_texture2d_program = 0;
|
static GLuint g_flat_fill_texture2d_program = 0;
|
||||||
static GLuint g_smooth_fill_solid_program = 0;
|
static GLuint g_smooth_fill_solid_program = 0;
|
||||||
static GLuint g_smooth_fill_texture2d_program = 0;
|
static GLuint g_smooth_fill_texture2d_program = 0;
|
||||||
|
|
||||||
|
static GLuint g_flat_fill_solid_shadeless_program = 0;
|
||||||
|
static GLuint g_flat_fill_texture2d_shadeless_program = 0;
|
||||||
|
static GLuint g_smooth_fill_solid_shadeless_program = 0;
|
||||||
|
static GLuint g_smooth_fill_texture2d_shadeless_program = 0;
|
||||||
|
|
||||||
static GLuint g_wireframe_program = 0;
|
static GLuint g_wireframe_program = 0;
|
||||||
|
|
||||||
static GLuint g_lighting_ub = 0;
|
static GLuint g_lighting_ub = 0;
|
||||||
@ -425,21 +431,45 @@ bool openSubdiv_osdGLDisplayInit(void)
|
|||||||
g_flat_fill_solid_program = linkProgram(
|
g_flat_fill_solid_program = linkProgram(
|
||||||
version,
|
version,
|
||||||
"#define USE_COLOR_MATERIAL\n"
|
"#define USE_COLOR_MATERIAL\n"
|
||||||
|
"#define USE_LIGHTING\n"
|
||||||
"#define FLAT_SHADING\n");
|
"#define FLAT_SHADING\n");
|
||||||
g_flat_fill_texture2d_program = linkProgram(
|
g_flat_fill_texture2d_program = linkProgram(
|
||||||
version,
|
version,
|
||||||
"#define USE_COLOR_MATERIAL\n"
|
"#define USE_COLOR_MATERIAL\n"
|
||||||
|
"#define USE_LIGHTING\n"
|
||||||
"#define USE_TEXTURE_2D\n"
|
"#define USE_TEXTURE_2D\n"
|
||||||
"#define FLAT_SHADING\n");
|
"#define FLAT_SHADING\n");
|
||||||
g_smooth_fill_solid_program = linkProgram(
|
g_smooth_fill_solid_program = linkProgram(
|
||||||
version,
|
version,
|
||||||
"#define USE_COLOR_MATERIAL\n"
|
"#define USE_COLOR_MATERIAL\n"
|
||||||
|
"#define USE_LIGHTING\n"
|
||||||
"#define SMOOTH_SHADING\n");
|
"#define SMOOTH_SHADING\n");
|
||||||
g_smooth_fill_texture2d_program = linkProgram(
|
g_smooth_fill_texture2d_program = linkProgram(
|
||||||
version,
|
version,
|
||||||
"#define USE_COLOR_MATERIAL\n"
|
"#define USE_COLOR_MATERIAL\n"
|
||||||
|
"#define USE_LIGHTING\n"
|
||||||
"#define USE_TEXTURE_2D\n"
|
"#define USE_TEXTURE_2D\n"
|
||||||
"#define SMOOTH_SHADING\n");
|
"#define SMOOTH_SHADING\n");
|
||||||
|
|
||||||
|
g_flat_fill_solid_shadeless_program = linkProgram(
|
||||||
|
version,
|
||||||
|
"#define USE_COLOR_MATERIAL\n"
|
||||||
|
"#define FLAT_SHADING\n");
|
||||||
|
g_flat_fill_texture2d_shadeless_program = linkProgram(
|
||||||
|
version,
|
||||||
|
"#define USE_COLOR_MATERIAL\n"
|
||||||
|
"#define USE_TEXTURE_2D\n"
|
||||||
|
"#define FLAT_SHADING\n");
|
||||||
|
g_smooth_fill_solid_shadeless_program = linkProgram(
|
||||||
|
version,
|
||||||
|
"#define USE_COLOR_MATERIAL\n"
|
||||||
|
"#define SMOOTH_SHADING\n");
|
||||||
|
g_smooth_fill_texture2d_shadeless_program = linkProgram(
|
||||||
|
version,
|
||||||
|
"#define USE_COLOR_MATERIAL\n"
|
||||||
|
"#define USE_TEXTURE_2D\n"
|
||||||
|
"#define SMOOTH_SHADING\n");
|
||||||
|
|
||||||
g_wireframe_program = linkProgram(
|
g_wireframe_program = linkProgram(
|
||||||
version,
|
version,
|
||||||
"#define WIREFRAME\n");
|
"#define WIREFRAME\n");
|
||||||
@ -464,21 +494,24 @@ void openSubdiv_osdGLDisplayDeinit(void)
|
|||||||
if (g_lighting_ub != 0) {
|
if (g_lighting_ub != 0) {
|
||||||
glDeleteBuffers(1, &g_lighting_ub);
|
glDeleteBuffers(1, &g_lighting_ub);
|
||||||
}
|
}
|
||||||
if (g_flat_fill_solid_program) {
|
#define SAFE_DELETE_PROGRAM(program) \
|
||||||
glDeleteProgram(g_flat_fill_solid_program);
|
do { \
|
||||||
}
|
if (program) { \
|
||||||
if (g_flat_fill_texture2d_program) {
|
glDeleteProgram(program); \
|
||||||
glDeleteProgram(g_flat_fill_texture2d_program);
|
} \
|
||||||
}
|
} while (false)
|
||||||
if (g_smooth_fill_solid_program) {
|
|
||||||
glDeleteProgram(g_flat_fill_solid_program);
|
SAFE_DELETE_PROGRAM(g_flat_fill_solid_program);
|
||||||
}
|
SAFE_DELETE_PROGRAM(g_flat_fill_texture2d_program);
|
||||||
if (g_smooth_fill_texture2d_program) {
|
SAFE_DELETE_PROGRAM(g_smooth_fill_solid_program);
|
||||||
glDeleteProgram(g_smooth_fill_texture2d_program);
|
SAFE_DELETE_PROGRAM(g_smooth_fill_texture2d_program);
|
||||||
}
|
SAFE_DELETE_PROGRAM(g_flat_fill_solid_shadeless_program);
|
||||||
if (g_wireframe_program) {
|
SAFE_DELETE_PROGRAM(g_flat_fill_texture2d_shadeless_program);
|
||||||
glDeleteProgram(g_wireframe_program);
|
SAFE_DELETE_PROGRAM(g_smooth_fill_solid_shadeless_program);
|
||||||
}
|
SAFE_DELETE_PROGRAM(g_smooth_fill_texture2d_shadeless_program);
|
||||||
|
SAFE_DELETE_PROGRAM(g_wireframe_program);
|
||||||
|
|
||||||
|
#undef SAFE_DELETE_PROGRAM
|
||||||
}
|
}
|
||||||
|
|
||||||
void openSubdiv_osdGLMeshDisplayPrepare(int use_osd_glsl,
|
void openSubdiv_osdGLMeshDisplayPrepare(int use_osd_glsl,
|
||||||
@ -599,23 +632,32 @@ static GLuint prepare_patchDraw(OpenSubdiv_GLMesh *gl_mesh,
|
|||||||
|
|
||||||
if (fill_quads) {
|
if (fill_quads) {
|
||||||
int model;
|
int model;
|
||||||
GLboolean use_texture_2d;
|
GLboolean use_texture_2d, use_lighting;
|
||||||
glGetIntegerv(GL_SHADE_MODEL, &model);
|
glGetIntegerv(GL_SHADE_MODEL, &model);
|
||||||
glGetBooleanv(GL_TEXTURE_2D, &use_texture_2d);
|
glGetBooleanv(GL_TEXTURE_2D, &use_texture_2d);
|
||||||
|
glGetBooleanv(GL_LIGHTING, &use_lighting);
|
||||||
if (model == GL_FLAT) {
|
if (model == GL_FLAT) {
|
||||||
if (use_texture_2d) {
|
if (use_texture_2d) {
|
||||||
program = g_flat_fill_texture2d_program;
|
program = use_lighting
|
||||||
|
? g_flat_fill_texture2d_program
|
||||||
|
: g_flat_fill_texture2d_shadeless_program;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
program = g_flat_fill_solid_program;
|
program = use_lighting
|
||||||
|
? g_flat_fill_solid_program
|
||||||
|
: g_flat_fill_solid_shadeless_program;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (use_texture_2d) {
|
if (use_texture_2d) {
|
||||||
program = g_smooth_fill_texture2d_program;
|
program = use_lighting
|
||||||
|
? g_smooth_fill_texture2d_program
|
||||||
|
: g_smooth_fill_texture2d_shadeless_program;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
program = g_smooth_fill_solid_program;
|
program = use_lighting
|
||||||
|
? g_smooth_fill_solid_program
|
||||||
|
: g_smooth_fill_solid_shadeless_program;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user