Example #1
0
// Load a texture from a TGA file.
GLuint loadTexture(const char *filename) {	

	// Load tga data into buffer.
	int width, height, alpha;
	unsigned char* pixels;

	pixels = (unsigned char*)readTga(filename, &width, &height, &alpha);
	if(pixels == 0) {
		fprintf(stderr, "Image loading failed: %s\n", filename);
		return 0;
	}

	// Generate texture, bind as active texture.
	GLuint texture;
	glGenTextures(1, &texture);
	glBindTexture(GL_TEXTURE_2D, texture);

	// Texture parameters
	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_WRAP_S, GL_REPEAT);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

	// Load pixels from buffer into texture.
	glTexImage2D(
		GL_TEXTURE_2D,
		0,
		alpha == 1 ? GL_RGBA8 : GL_RGB8,
		width,
		height,
		0,
		alpha == 1 ? GL_BGRA : GL_BGR,
		GL_UNSIGNED_BYTE,
		pixels
	);
	glGenerateMipmap(GL_TEXTURE_2D);

	// Release buffer.
	free(pixels);

	return texture;
}
Example #2
0
//------------------------------------------------------------------------
//------------------------------------------------------------------------
SmartPointer<Texture> Texture::open(std::string filename,bool bUseCacheIfPossible,bool bCacheInMemory)
{
	if (!filename.length()) 
	{
		Log::printf("Texture::open cannot open texture because filename is empty\n");
		return SmartPointer<Texture>();
	}

	//use cache?
	if (bUseCacheIfPossible)
	{
		if (textures_in_cache.find(Utils::ToLower(filename))!=textures_in_cache.end())
		{
			//Log::printf("Opened texture file %s from cache (already in memory)\n",Filename.c_str());
			return textures_in_cache[Utils::ToLower(filename)];
		}
	}


	//opening from disk
  juce::File   jfile(juce::File::getCurrentWorkingDirectory().getChildFile(filename.c_str()));
  juce::String jext=jfile.getFileExtension().toLowerCase();

  SmartPointer<Texture> ret;
  if (jext==".tga")
  {
    ret=readTga(filename);

    if (!ret)
      return ret; //failed
  }
  else
  {
    juce::Image jimg=juce::ImageFileFormat::loadFrom(jfile);

    if (!jimg.isValid())
	  {
		  Log::printf("Texture::open cannot open texture file %s \n",filename.c_str());
		  return SmartPointer<Texture>();
	  }

	  int width  = jimg.getWidth();
	  int height = jimg.getHeight();
	  int bpp    = jimg.getFormat()==juce::Image::ARGB? 32 : (jimg.getFormat()==juce::Image::RGB? 24 : (jimg.getFormat()==juce::Image::SingleChannel? 8:0));

	  if((width == 0) || (height == 0) || !(bpp==24 || bpp==32 || bpp==8))
	  {
		  Log::printf("Texture::open failed to load the texture file %s (reason  unsupported type bpp=%d width=%d height=%d\n",filename.c_str(),bpp,width,height);
		  return SmartPointer<Texture>();
	  }

	  ret=SmartPointer<Texture>(new Texture(width,height,bpp,0));
    unsigned char* dst=ret->buffer;

	  //Alpha
	  if (bpp==8)
	  {
		  for (int Y=0;Y<height;Y++) {
		  for (int X=0;X<width ;X++) {
        juce::Colour colour=jimg.getPixelAt(X,height-Y-1); //mirror y
			  *dst++=colour.getAlpha();
		  }}
	  }
	  //RGB
	  else if (bpp==24)
	  {	
		  for (int Y=0;Y<height;Y++) {
		  for (int X=0;X<width ;X++) {
        juce::Colour colour=jimg.getPixelAt(X,height-Y-1); //mirror y
			  *dst++=colour.getRed  ();
			  *dst++=colour.getGreen();
			  *dst++=colour.getBlue ();
		  }}
	  }
	  //RGBA
	  else if (bpp==32)
	  {
		  for (int Y=0;Y<height;Y++) {
		  for (int X=0;X<width ;X++) {
        juce::Colour colour=jimg.getPixelAt(X,height-Y-1); //mirror y
			  *dst++=colour.getRed  ();
			  *dst++=colour.getGreen();
			  *dst++=colour.getBlue ();
        *dst++=colour.getAlpha();
		  }}
	  }
  }

	Log::printf("image file %s loaded from disk width(%d) height(%d) bpp(%d)\n",filename.c_str(),ret->width,ret->height,ret->bpp);

	if (bCacheInMemory)
		textures_in_cache[Utils::ToLower(filename)]=ret;

	ret->filename=filename;
	return ret;

}