Package com.base.engine.rendering

Source Code of com.base.engine.rendering.Texture

/*
* Copyright (C) 2014 Benny Bobaganoosh
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.base.engine.rendering;

import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL13.*;

import java.awt.image.BufferedImage;
import java.io.File;
import java.nio.ByteBuffer;
import java.util.HashMap;

import com.base.engine.core.*;
import com.base.engine.rendering.resourceManagement.TextureResource;

import javax.imageio.ImageIO;

public class Texture
{
  private static HashMap<String, TextureResource> s_loadedTextures = new HashMap<String, TextureResource>();
  private TextureResource m_resource;
  private String          m_fileName;
 
  public Texture(String fileName)
  {
    this.m_fileName = fileName;
    TextureResource oldResource = s_loadedTextures.get(fileName);

    if(oldResource != null)
    {
      m_resource = oldResource;
      m_resource.AddReference();
    }
    else
    {
      m_resource = LoadTexture(fileName);
      s_loadedTextures.put(fileName, m_resource);
    }
  }

  @Override
  protected void finalize()
  {
    if(m_resource.RemoveReference() && !m_fileName.isEmpty())
    {
      s_loadedTextures.remove(m_fileName);
    }
  }

  public void Bind()
  {
    Bind(0);
  }

  public void Bind(int samplerSlot)
  {
    assert(samplerSlot >= 0 && samplerSlot <= 31);
    glActiveTexture(GL_TEXTURE0 + samplerSlot);
    glBindTexture(GL_TEXTURE_2D, m_resource.GetId());
  }
 
  public int GetID()
  {
    return m_resource.GetId();
  }
 
  private static TextureResource LoadTexture(String fileName)
  {
    try
    {
      BufferedImage image = ImageIO.read(new File("./res/textures/" + fileName));
      int[] pixels = image.getRGB(0, 0, image.getWidth(), image.getHeight(), null, 0, image.getWidth());

      ByteBuffer buffer = Util.CreateByteBuffer(image.getHeight() * image.getWidth() * 4);
      boolean hasAlpha = image.getColorModel().hasAlpha();

      for(int y = 0; y < image.getHeight(); y++)
      {
        for(int x = 0; x < image.getWidth(); x++)
        {
          int pixel = pixels[y * image.getWidth() + x];

          buffer.put((byte)((pixel >> 16) & 0xFF));
          buffer.put((byte)((pixel >> 8) & 0xFF));
          buffer.put((byte)((pixel) & 0xFF));
          if(hasAlpha)
            buffer.put((byte)((pixel >> 24) & 0xFF));
          else
            buffer.put((byte)(0xFF));
        }
      }

      buffer.flip();

      TextureResource resource = new TextureResource();
      glBindTexture(GL_TEXTURE_2D, resource.GetId());

      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

      return resource;
    }
    catch(Exception e)
    {
      e.printStackTrace();
      System.exit(1);
    }
   
    return null;
  }
}
TOP

Related Classes of com.base.engine.rendering.Texture

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.