SimpleJavaEngine/src/main/java/speiger/src/coreengine/rendering/textures/simple/SimpleTexture.java

70 lines
2.3 KiB
Java

package speiger.src.coreengine.rendering.textures.simple;
import java.io.IOException;
import java.nio.ByteBuffer;
import org.lwjgl.opengl.GL45;
import org.lwjgl.stb.STBImage;
import org.lwjgl.system.MemoryUtil;
import speiger.src.coreengine.assets.AssetLocation;
import speiger.src.coreengine.assets.base.IAsset;
import speiger.src.coreengine.assets.base.IAssetProvider;
import speiger.src.coreengine.assets.parsers.NativeMemoryParser;
import speiger.src.coreengine.rendering.textures.base.BaseTexture;
import speiger.src.coreengine.rendering.textures.base.TextureMetadata;
import speiger.src.coreengine.rendering.utils.values.GLDataType;
import speiger.src.coreengine.rendering.utils.values.textures.GLTextureFormat;
public class SimpleTexture extends BaseTexture {
AssetLocation location;
TextureMetadata metadata;
int width;
int height;
public SimpleTexture(AssetLocation location, TextureMetadata metadata) {
this.location = location;
this.metadata = metadata;
}
@Override
public void load(IAssetProvider provider) {
long address = 0L;
int channel = GLTextureFormat.toComponents(metadata.getExternalFormat());
try(IAsset asset = provider.getAsset(location)) {
ByteBuffer buffer = asset.custom(NativeMemoryParser.INSTANCE);
int[] width = new int[1];
int[] height = new int[1];
int[] fileChannels = new int[1];
address = STBImage.nstbi_load_from_memory(MemoryUtil.memAddress(buffer), buffer.remaining(), width, height, fileChannels, channel);
MemoryUtil.memFree(buffer);
if(address == 0) {
throw new IllegalArgumentException("Couldn't load texture ["+location+"]");
}
this.width = width[0];
this.height = height[0];
if(channel == 0) channel = fileChannels[0];
}
catch(IOException e) {
e.printStackTrace();
}
if(address == 0L) return;
createTexture();
metadata.applyArguments(id);
GL45.glTextureStorage2D(id, 1, metadata.getInternalFormat(), width, height);
GL45.nglTextureSubImage2D(id, 0, 0, 0, width, height, GLTextureFormat.bySTB(channel).glValue(), GLDataType.UNSIGNED_BYTE.glValue(), address);
if(metadata.generateMipMappings()) GL45.glGenerateTextureMipmap(id);
STBImage.nstbi_image_free(address);
}
@Override
public int width() {
return width;
}
@Override
public int height() {
return height;
}
}