#define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" #include "root.h" #include "texture.h" #include "fontAsset.h" #include "imageAsset.h" #include "assetManager.h" #include #include #include using namespace std; namespace vb01{ //TODO deallocate (V)RAM for this constructor Texture::Texture(int w, int h, bool shadowMap, bool hiRes) : Animatable(Animatable::TEXTURE), width(w), height(h), texture(new u32){ if(shadowMap){ /* texture = new u32; glGenTextures(1, &texture[0]); glBindTexture(GL_TEXTURE_2D, texture[0]); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); float borderColor[] = {1, 1, 1, 1}; glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor); */ } else Root::getSingleton()->initTextureDataOnGpu(width, height); } Texture::Texture(string paths[], int np, bool cm, int ml, bool flip, string name) : Animatable(Animatable::TEXTURE, name), numFrames(np), cubemap(cm), mipmapLevel(ml){ this->paths = new string[np]; for(int i = 0; i < np; i++){ this->paths[i] = paths[i]; if(!cm){ ImageAsset *imgAsset = (ImageAsset*)AssetManager::getSingleton()->getAsset(paths[i]); frames.push_back(Frame(imgAsset->bufferId, imgAsset->layerId)); } } if(cm) Root::getSingleton()->createCubemap(false, true, paths, ml); } Texture::Texture(int w, bool depth, int ml, string name) : Animatable(Animatable::TEXTURE, name), width(w), mipmapLevel(ml), cubemap(true){ string p[6]{""}; Root::getSingleton()->createCubemap(depth, false, p, ml); } Texture::Texture(string path, int id) : Animatable(Animatable::TEXTURE){ FontAsset *fontAsset = (FontAsset*)AssetManager::getSingleton()->getAsset(path); const FontAsset::Glyph &glyph = fontAsset->getGlyph(id); frames.push_back(Frame(glyph.bufferId, glyph.layerId)); } Texture::~Texture(){ if(paths) delete paths; } void Texture::animate(float value, KeyframeChannel keyframeChannel){ switch(keyframeChannel.type){ case KeyframeChannel::TEXTURE_MIX_RATIO: mixRatio = value; break; case KeyframeChannel::TEXTURE_FRAME_A: frameA = (int)value; break; case KeyframeChannel::TEXTURE_FRAME_B: frameB = (int)value; break; } } void Texture::update(int id){ /* select(id, frameA); if(numFrames > 0) select(id + 1, frameB); */ } void Texture::select(int id, int fr){ glActiveTexture(GL_TEXTURE0 + id); glBindTexture(cubemap ? GL_TEXTURE_CUBE_MAP : GL_TEXTURE_2D, texture[fr]); } }