diff --git a/material.cpp b/material.cpp index cd2fe93..7320b84 100755 --- a/material.cpp +++ b/material.cpp @@ -84,20 +84,22 @@ namespace vb01{ void Material::update(){ shader->use(); shader->setBool(texturingEnabled, "texturingEnabled"); - const int DIFFUSE_SLOT = Texture::DIFFUSE * 2; - const int NORMAL_SLOT = Texture::NORMAL * 2; - const int SPECULAR_SLOT = Texture::SPECULAR * 2; - const int PARALLAX_SLOT = Texture::PARALLAX * 2; - const int ENVIRONMENT_SLOT = Texture::ENVIRONMENT * 2; + 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"); - shader->setInt(DIFFUSE_SLOT, "textures["+to_string(DIFFUSE_SLOT)+"].pastTexture"); - shader->setInt(NORMAL_SLOT, "textures["+to_string(NORMAL_SLOT)+"].pastTexture"); - shader->setInt(SPECULAR_SLOT, "textures["+to_string(SPECULAR_SLOT)+"].pastTexture"); - shader->setInt(PARALLAX_SLOT, "textures["+to_string(PARALLAX_SLOT)+"].pastTexture"); - shader->setInt(ENVIRONMENT_SLOT, "environmentMap"); + 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"); @@ -106,18 +108,18 @@ namespace vb01{ } if(texturingEnabled){ - int textureSlot = DIFFUSE_SLOT; - for(Texture *t : diffuseMapTextures){ - t->update(textureSlot); - if(t->getNumFrames() > 0) - shader->setBool(true, "textures[" + to_string(textureSlot) + "].animated"); + vector 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); } - for(Texture *t : normalMapTextures) - t->update(NORMAL_SLOT); - for(Texture *t : specularMapTextures) - t->update(SPECULAR_SLOT); - for(Texture *t : parallaxMapTextures) - t->update(PARALLAX_SLOT); } else shader->setVec4(diffuseColor, "diffuseColor"); diff --git a/texture.cpp b/texture.cpp index 13ebf2b..73f8894 100755 --- a/texture.cpp +++ b/texture.cpp @@ -149,10 +149,10 @@ namespace vb01{ } void Texture::update(int id){ - updateFrame(); + //updateFrame(); select(id); if(numFrames > 0) - select(id + 1); + select(id + 1, 1); } void Texture::updateFrame(){ @@ -166,6 +166,6 @@ namespace vb01{ void Texture::select(int id, int fr){ glActiveTexture(GL_TEXTURE0 + id); - glBindTexture(type == TEXTURE_2D ? GL_TEXTURE_2D : GL_TEXTURE_CUBE_MAP, texture[frame]); + glBindTexture(type == TEXTURE_2D ? GL_TEXTURE_2D : GL_TEXTURE_CUBE_MAP, texture[fr]); } } diff --git a/texture.frag b/texture.frag index e5cab48..3a61aad 100755 --- a/texture.frag +++ b/texture.frag @@ -75,7 +75,12 @@ float getShadow(int id){ } void main(){ - vec4 finalColor = texturingEnabled?texture(textures[0].pastTexture, texCoords) : diffuseColor; + vec4 finalColor = diffuseColor; + if(texturingEnabled){ + vec4 textureColor = texture(textures[0].pastTexture, texCoords); + finalColor = textures[0].animated ? mix(textureColor, texture(textures[0].nextTexture, texCoords), textures[0].mixRatio) : textureColor; + } + vec3 normal = norm; if(lightingEnabled){ if(normalMapEnabled){ diff --git a/texture.h b/texture.h index 6e27c35..a99e8fe 100755 --- a/texture.h +++ b/texture.h @@ -24,12 +24,14 @@ namespace vb01{ inline unsigned int* getTexture(int i = 0){return &(texture[i]);} inline std::string getPath(){return path;} inline int getNumFrames(){return numFrames;} + inline float getMixRatio(){return mixRatio;} + inline TextureTypeId getTextureTypeId(){return typeId;} private: TextureType type = TextureType::TEXTURE_2D; TextureTypeId typeId = DIFFUSE; u32 *texture = nullptr; s64 lastUpdateTime = 0; - int width, height, numChannels, updateRate = 0, numFrames = 0, frameA = 0, frameB = 0; + int width, height, numChannels; float mixRatio; u8 *data; std::string path = "", paths[6];