Files
vb01/material.cpp
T
2021-10-19 19:06:41 +03:00

133 lines
3.7 KiB
C++
Executable File

#include "material.h"
#include "shader.h"
#include "root.h"
using namespace std;
namespace vb01{
Material::Material(Type type){
this->type = type;
initShader();
}
Material::~Material(){
delete shader;
for(Texture *t : diffuseMapTextures)
delete t;
for(Texture *t : normalMapTextures)
delete t;
for(Texture *t : specularMapTextures)
delete t;
}
void Material::initShader(){
string basePath = "../../vb01/", shaderName;
switch(type){
case MATERIAL_2D:
shaderName = "texture.";
break;
case MATERIAL_PARTICLE:
shaderName = "particle.";
break;
case MATERIAL_SKYBOX:
shaderName = "skybox.";
break;
case MATERIAL_GUI:
shaderName = "gui.";
break;
case MATERIAL_POST:
shaderName = "postProcess.";
break;
case MATERIAL_TEXT:
shaderName = "text.";
break;
}
/*
if(type==MATERIAL_2D)
//shader=new Shader(basePath+shaderName+"vert",basePath+shaderName+"frag");
shader=new Shader(basePath+shaderName+"vert",basePath+shaderName+"frag",basePath+shaderName+"geo");
else
*/
shader = new Shader(basePath + shaderName + "vert", basePath + shaderName + "frag");
}
void Material::animate(float value, KeyframeChannel keyframeChannel){
switch(keyframeChannel.type){
case KeyframeChannel::DIFFUSE_COLOR_W:
diffuseColor.w = value;
break;
case KeyframeChannel::DIFFUSE_COLOR_X:
diffuseColor.x = value;
break;
case KeyframeChannel::DIFFUSE_COLOR_Y:
diffuseColor.y = value;
break;
case KeyframeChannel::DIFFUSE_COLOR_Z:
diffuseColor.z = value;
break;
case KeyframeChannel::SPECULAR_COLOR_W:
specularColor.w = value;
break;
case KeyframeChannel::SPECULAR_COLOR_X:
specularColor.x = value;
break;
case KeyframeChannel::SPECULAR_COLOR_Y:
specularColor.y = value;
break;
case KeyframeChannel::SPECULAR_COLOR_Z:
specularColor.z = value;
break;
}
}
void Material::update(){
shader->use();
shader->setBool(texturingEnabled, "texturingEnabled");
const int TEXTURE_SLOTS[]{
Texture::DIFFUSE * 2,
Texture::NORMAL * 2,
Texture::SPECULAR * 2,
Texture::PARALLAX * 2,
Texture::ENVIRONMENT * 2
};
if(type == MATERIAL_2D){
shader->setBool(lightingEnabled, "lightingEnabled");
shader->setBool(normalMapEnabled, "normalMapEnabled");
for(int i = 0; i < 4; i++){
shader->setInt(TEXTURE_SLOTS[i], "textures[" + to_string(TEXTURE_SLOTS[i]) + "].pastTexture");
shader->setInt(TEXTURE_SLOTS[i] + 1, "textures[" + to_string(TEXTURE_SLOTS[i]) + "].nextTexture");
}
shader->setInt(TEXTURE_SLOTS[4], "environmentMap");
}
else if(type == MATERIAL_GUI){
shader->setBool(diffuseColorEnabled, "diffuseColorEnabled");
if(diffuseColorEnabled)
shader->setVec4(diffuseColor, "diffuseColor");
}
else if(type == MATERIAL_TEXT){
shader->setInt(0, "textures[0].pastTexture");
shader->setInt(1, "textures[0].nextTexture");
shader->setInt(2, "textures[1].pastTexture");
}
if(texturingEnabled){
vector<Texture*> textures;
textures.insert(textures.end(), diffuseMapTextures.begin(), diffuseMapTextures.end());
textures.insert(textures.end(), normalMapTextures.begin(), normalMapTextures.end());
textures.insert(textures.end(), specularMapTextures.begin(), specularMapTextures.end());
textures.insert(textures.end(), parallaxMapTextures.begin(), parallaxMapTextures.end());
for(Texture *t : textures){
int id = t->getTextureTypeId() * 2;
shader->setBool(t->getNumFrames() > 0, "textures[" + to_string(id) + "].animated");
shader->setFloat(t->getMixRatio(), "textures[" + to_string(id) + "].mixRatio");
t->update(id);
}
}
else
shader->setVec4(diffuseColor, "diffuseColor");
}
}