Renderer/src/main/java/electrosphere/engine/loadingthreads/InitialAssetLoading.java
austin ac12b3f5a8
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
async load texture atlas
2024-05-07 21:39:20 -04:00

105 lines
3.5 KiB
Java

package electrosphere.engine.loadingthreads;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import javax.imageio.ImageIO;
import electrosphere.client.terrain.cells.VoxelTextureAtlas;
import electrosphere.engine.Globals;
import electrosphere.engine.assetmanager.queue.QueuedTexture;
import electrosphere.game.data.voxel.VoxelData;
import electrosphere.game.data.voxel.VoxelType;
import electrosphere.logger.LoggerInterface;
import electrosphere.util.FileUtils;
/**
* The intention of this thread is to load basic assets that the engine should generally have available from the start.
* Examples:
* - Texture Atlas for terrain
* - Icons for items
*/
public class InitialAssetLoading implements Runnable {
//tracks whether this thread is still doing work or not
boolean loading = true;
/**
* Loads basic data
*/
public void LoadData(){
loadTextureAtlas();
LoggerInterface.loggerEngine.INFO("Finished loading texture atlas");
loading = false;
}
/**
* Gets whether the thread is still loading or not
* @return true if loading, false otherwise
*/
public boolean isLoading(){
return loading;
}
/**
* Loads the texture atlas
*/
private void loadTextureAtlas(){
//terrain texture atlas
Globals.profiler.beginCpuSample("createVoxelTextureAtlas");
VoxelData data = Globals.gameConfigCurrent.getVoxelData();
int iterator = 0;
BufferedImage image = new BufferedImage(VoxelTextureAtlas.ATLAS_DIM, VoxelTextureAtlas.ATLAS_DIM, BufferedImage.TYPE_4BYTE_ABGR);
Graphics graphics = image.getGraphics();
for(VoxelType type : data.getTypes()){
if(type.getTexture() != null){
int offX = iterator % VoxelTextureAtlas.ELEMENTS_PER_ROW;
int offY = iterator / VoxelTextureAtlas.ELEMENTS_PER_ROW;
try {
BufferedImage newType = ImageIO.read(FileUtils.getAssetFile(type.getTexture()));
graphics.drawImage(newType, iterator * VoxelTextureAtlas.ATLAS_ELEMENT_DIM * offX, VoxelTextureAtlas.ATLAS_DIM - VoxelTextureAtlas.ATLAS_ELEMENT_DIM - iterator * VoxelTextureAtlas.ATLAS_ELEMENT_DIM * offY, null);
} catch (IOException e) {
LoggerInterface.loggerRenderer.ERROR("Texture atlas failed to find texture " + type.getTexture(), e);
}
//put coords in map
Globals.voxelTextureAtlas.putTypeCoord(type.getId(),iterator);
//iterate
iterator++;
}
}
Globals.profiler.endCpuSample();
//queue to asset manager
QueuedTexture atlasQueuedTexture = new QueuedTexture(image);
Globals.assetManager.queuedAsset(atlasQueuedTexture);
//wait the texture to be loaded
while(!atlasQueuedTexture.hasLoaded()){
try {
TimeUnit.MILLISECONDS.sleep(1);
} catch (InterruptedException e) {
LoggerInterface.loggerEngine.ERROR("failed to sleep", e);
}
}
//construct texture atlas from buffered image
Globals.voxelTextureAtlas.setSpecular(atlasQueuedTexture.getTexture());
Globals.voxelTextureAtlas.setNormal(atlasQueuedTexture.getTexture());
}
@Override
public void run(){
this.LoadData();
}
}