148 lines
4.2 KiB
C++
148 lines
4.2 KiB
C++
//
|
|
// KRMaterial.cpp
|
|
// gldemo
|
|
//
|
|
// Created by Kearwood Gilbert on 10-10-24.
|
|
// Copyright (c) 2010 Kearwood Software. All rights reserved.
|
|
//
|
|
|
|
#include "KRMaterial.h"
|
|
|
|
KRMaterial::KRMaterial() {
|
|
m_pAmbientMap = NULL;
|
|
m_pDiffuseMap = NULL;
|
|
m_pSpecularMap = NULL;
|
|
m_pNormalMap = NULL;
|
|
m_ka_r = (GLfloat)0.0f;
|
|
m_ka_g = (GLfloat)0.0f;
|
|
m_ka_b = (GLfloat)0.0f;
|
|
m_kd_r = (GLfloat)1.0f;
|
|
m_kd_g = (GLfloat)1.0f;
|
|
m_kd_b = (GLfloat)1.0f;
|
|
m_ks_r = (GLfloat)1.0f;
|
|
m_ks_g = (GLfloat)1.0f;
|
|
m_ks_b = (GLfloat)1.0f;
|
|
}
|
|
|
|
KRMaterial::~KRMaterial() {
|
|
|
|
}
|
|
|
|
void KRMaterial::setAmbientMap(KRTexture *pTexture) {
|
|
m_pAmbientMap = pTexture;
|
|
}
|
|
|
|
void KRMaterial::setDiffuseMap(KRTexture *pTexture) {
|
|
m_pDiffuseMap = pTexture;
|
|
}
|
|
|
|
void KRMaterial::setSpecularMap(KRTexture *pTexture) {
|
|
m_pSpecularMap = pTexture;
|
|
}
|
|
|
|
void KRMaterial::setNormalMap(KRTexture *pTexture) {
|
|
m_pNormalMap = pTexture;
|
|
}
|
|
|
|
void KRMaterial::setAmbient(GLfloat r, GLfloat g, GLfloat b) {
|
|
m_ka_r = r;
|
|
m_ka_g = g;
|
|
m_ka_b = b;
|
|
}
|
|
|
|
void KRMaterial::setDiffuse(GLfloat r, GLfloat g, GLfloat b) {
|
|
m_kd_r = r;
|
|
m_kd_g = g;
|
|
m_kd_b = b;
|
|
}
|
|
|
|
void KRMaterial::setSpecular(GLfloat r, GLfloat g, GLfloat b) {
|
|
m_ks_r = r;
|
|
m_ks_g = g;
|
|
m_ks_b = b;
|
|
}
|
|
|
|
void KRMaterial::bind(GLuint program) {
|
|
|
|
GLuint uniform_material_ambient = glGetUniformLocation(program, "material_ambient");
|
|
GLuint uniform_material_diffuse = glGetUniformLocation(program, "material_diffuse");
|
|
GLuint uniform_material_specular = glGetUniformLocation(program, "material_specular");
|
|
|
|
glUniform3f(
|
|
uniform_material_ambient,
|
|
m_ka_r, // iMaterial % 2 ? (GLfloat)0.9f : (GLfloat)0.5f,
|
|
m_ka_g, // iMaterial % 4 ? (GLfloat)0.9f : (GLfloat)0.5f,
|
|
m_ka_b // iMaterial % 8 ? (GLfloat)0.9f : (GLfloat)0.5f,
|
|
);
|
|
|
|
glUniform3f(
|
|
uniform_material_diffuse,
|
|
m_kd_r + 1.0f, // 1.0 added so there will not be complete darkness
|
|
m_kd_g + 1.0f, // 1.0 added so there will not be complete darkness
|
|
m_kd_b + 1.0f // 1.0 added so there will not be complete darkness
|
|
);
|
|
|
|
glUniform3f(
|
|
uniform_material_specular,
|
|
m_ks_r, // iMaterial % 2 ? (GLfloat)0.9f : (GLfloat)0.5f,
|
|
m_ks_g, // iMaterial % 4 ? (GLfloat)0.9f : (GLfloat)0.5f,
|
|
m_ks_b // iMaterial % 8 ? (GLfloat)0.9f : (GLfloat)0.5f,
|
|
);
|
|
|
|
|
|
|
|
int iTextureName = 0;
|
|
if(m_pDiffuseMap != NULL) {
|
|
iTextureName = m_pDiffuseMap->getName();
|
|
glActiveTexture(GL_TEXTURE0);
|
|
glBindTexture(GL_TEXTURE_2D, iTextureName);
|
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
|
}
|
|
|
|
|
|
iTextureName = 0;
|
|
if(m_pSpecularMap != NULL) {
|
|
iTextureName = m_pSpecularMap->getName();
|
|
glActiveTexture(GL_TEXTURE1);
|
|
glBindTexture(GL_TEXTURE_2D, iTextureName);
|
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
|
}
|
|
|
|
|
|
iTextureName = 0;
|
|
if(m_pNormalMap != NULL) {
|
|
iTextureName = m_pNormalMap->getName();
|
|
glActiveTexture(GL_TEXTURE2);
|
|
glBindTexture(GL_TEXTURE_2D, iTextureName);
|
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
|
}
|
|
|
|
|
|
|
|
|
|
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
|
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
|
|
/*
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
*/
|
|
/*
|
|
if (_anisotropySupported)
|
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, _anisotropyTexParam);
|
|
*/
|
|
/*
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
|
*/
|
|
|
|
|
|
|
|
|
|
} |