70 lines
2.3 KiB
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;
|
|
}
|
|
}
|