433
433
#include "vbo_attrib_tmp.h"
438
* Execute a glMaterial call. Note that if GL_COLOR_MATERIAL is enabled,
439
* this may be a (partial) no-op.
441
static void GLAPIENTRY
442
vbo_Materialfv(GLenum face, GLenum pname, const GLfloat *params)
444
GLbitfield updateMats;
445
GET_CURRENT_CONTEXT(ctx);
447
/* This function should be a no-op when it tries to update material
448
* attributes which are currently tracking glColor via glColorMaterial.
449
* The updateMats var will be a mask of the MAT_BIT_FRONT/BACK_x bits
450
* indicating which material attributes can actually be updated below.
452
if (ctx->Light.ColorMaterialEnabled) {
453
updateMats = ~ctx->Light.ColorMaterialBitmask;
456
/* GL_COLOR_MATERIAL is disabled so don't skip any material updates */
457
updateMats = ALL_MATERIAL_BITS;
460
if (face == GL_FRONT) {
461
updateMats &= FRONT_MATERIAL_BITS;
463
else if (face == GL_BACK) {
464
updateMats &= BACK_MATERIAL_BITS;
466
else if (face != GL_FRONT_AND_BACK) {
467
_mesa_error(ctx, GL_INVALID_ENUM, "glMaterial(invalid face)");
473
if (updateMats & MAT_BIT_FRONT_EMISSION)
474
MAT_ATTR(VBO_ATTRIB_MAT_FRONT_EMISSION, 4, params);
475
if (updateMats & MAT_BIT_BACK_EMISSION)
476
MAT_ATTR(VBO_ATTRIB_MAT_BACK_EMISSION, 4, params);
479
if (updateMats & MAT_BIT_FRONT_AMBIENT)
480
MAT_ATTR(VBO_ATTRIB_MAT_FRONT_AMBIENT, 4, params);
481
if (updateMats & MAT_BIT_BACK_AMBIENT)
482
MAT_ATTR(VBO_ATTRIB_MAT_BACK_AMBIENT, 4, params);
485
if (updateMats & MAT_BIT_FRONT_DIFFUSE)
486
MAT_ATTR(VBO_ATTRIB_MAT_FRONT_DIFFUSE, 4, params);
487
if (updateMats & MAT_BIT_BACK_DIFFUSE)
488
MAT_ATTR(VBO_ATTRIB_MAT_BACK_DIFFUSE, 4, params);
491
if (updateMats & MAT_BIT_FRONT_SPECULAR)
492
MAT_ATTR(VBO_ATTRIB_MAT_FRONT_SPECULAR, 4, params);
493
if (updateMats & MAT_BIT_BACK_SPECULAR)
494
MAT_ATTR(VBO_ATTRIB_MAT_BACK_SPECULAR, 4, params);
497
if (*params < 0 || *params > ctx->Const.MaxShininess) {
498
_mesa_error(ctx, GL_INVALID_VALUE,
499
"glMaterial(invalid shininess: %f out range [0, %f])",
500
*params, ctx->Const.MaxShininess);
503
if (updateMats & MAT_BIT_FRONT_SHININESS)
504
MAT_ATTR(VBO_ATTRIB_MAT_FRONT_SHININESS, 1, params);
505
if (updateMats & MAT_BIT_BACK_SHININESS)
506
MAT_ATTR(VBO_ATTRIB_MAT_BACK_SHININESS, 1, params);
508
case GL_COLOR_INDEXES:
509
if (updateMats & MAT_BIT_FRONT_INDEXES)
510
MAT_ATTR(VBO_ATTRIB_MAT_FRONT_INDEXES, 3, params);
511
if (updateMats & MAT_BIT_BACK_INDEXES)
512
MAT_ATTR(VBO_ATTRIB_MAT_BACK_INDEXES, 3, params);
514
case GL_AMBIENT_AND_DIFFUSE:
515
if (updateMats & MAT_BIT_FRONT_AMBIENT)
516
MAT_ATTR(VBO_ATTRIB_MAT_FRONT_AMBIENT, 4, params);
517
if (updateMats & MAT_BIT_FRONT_DIFFUSE)
518
MAT_ATTR(VBO_ATTRIB_MAT_FRONT_DIFFUSE, 4, params);
519
if (updateMats & MAT_BIT_BACK_AMBIENT)
520
MAT_ATTR(VBO_ATTRIB_MAT_BACK_AMBIENT, 4, params);
521
if (updateMats & MAT_BIT_BACK_DIFFUSE)
522
MAT_ATTR(VBO_ATTRIB_MAT_BACK_DIFFUSE, 4, params);
525
_mesa_error(ctx, GL_INVALID_ENUM, "glMaterialfv(pname)");
437
532
* Flush (draw) vertices.
438
533
* \param unmap - leave VBO unmapped after flushing?