improve menu perf while init asset loading
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
This commit is contained in:
parent
8ecfcdfc9d
commit
0961b42e26
@ -1303,6 +1303,7 @@ Fix server terrain physics entity positioning
|
|||||||
Disable client fluid draw cell loading gate
|
Disable client fluid draw cell loading gate
|
||||||
Properly differentiate local/world bone attach point calculation
|
Properly differentiate local/world bone attach point calculation
|
||||||
Floating origin implementation for collision engine
|
Floating origin implementation for collision engine
|
||||||
|
Improve initial asset loading performance
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1310,8 +1311,6 @@ Floating origin implementation for collision engine
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
Fix physics breaking at far-off locations
|
|
||||||
- separately simulated regions of physics that dynamically merge/unmerge based on chunk loading
|
|
||||||
|
|
||||||
Implement gadgets
|
Implement gadgets
|
||||||
- Chemistry System
|
- Chemistry System
|
||||||
@ -1332,6 +1331,10 @@ Implement gadgets
|
|||||||
- Torch
|
- Torch
|
||||||
- Throwable potions
|
- Throwable potions
|
||||||
|
|
||||||
|
Floating world origin
|
||||||
|
- Better criteria to update floating world origin in collision engine (can't run every frame cause very very expensive, but need to periodically check so it doesn't become irrelevant)
|
||||||
|
- Separately simulated regions of physics that dynamically merge/unmerge based on chunk loading
|
||||||
|
|
||||||
Bug Fixes
|
Bug Fixes
|
||||||
- Fix hitbox placement does not scale with entity scale on server
|
- Fix hitbox placement does not scale with entity scale on server
|
||||||
- Calculate bounding sphere for meshes by deforming vertices with bone default pose instead of no bone deform
|
- Calculate bounding sphere for meshes by deforming vertices with bone default pose instead of no bone deform
|
||||||
|
|||||||
@ -15,6 +15,7 @@ import org.lwjgl.BufferUtils;
|
|||||||
import electrosphere.client.terrain.cache.ChunkData;
|
import electrosphere.client.terrain.cache.ChunkData;
|
||||||
import electrosphere.engine.Globals;
|
import electrosphere.engine.Globals;
|
||||||
import electrosphere.engine.assetmanager.queue.QueuedTexture;
|
import electrosphere.engine.assetmanager.queue.QueuedTexture;
|
||||||
|
import electrosphere.engine.assetmanager.queue.QueuedTexture.QueuedTextureType;
|
||||||
import electrosphere.entity.ClientEntityUtils;
|
import electrosphere.entity.ClientEntityUtils;
|
||||||
import electrosphere.entity.Entity;
|
import electrosphere.entity.Entity;
|
||||||
import electrosphere.entity.EntityCreationUtils;
|
import electrosphere.entity.EntityCreationUtils;
|
||||||
@ -214,7 +215,7 @@ public class FoliageModel {
|
|||||||
int textureWidth = (1 + (drawCount / MAX_TEXTURE_HEIGHT)) * (SINGLE_FOLIAGE_DATA_SIZE_BYTES / 4);
|
int textureWidth = (1 + (drawCount / MAX_TEXTURE_HEIGHT)) * (SINGLE_FOLIAGE_DATA_SIZE_BYTES / 4);
|
||||||
|
|
||||||
//construct data texture
|
//construct data texture
|
||||||
QueuedTexture queuedAsset = new QueuedTexture(buffer,textureWidth,textureHeight);
|
QueuedTexture queuedAsset = new QueuedTexture(QueuedTextureType.DATA_BUFF,buffer,textureWidth,textureHeight);
|
||||||
Globals.assetManager.queuedAsset(queuedAsset);
|
Globals.assetManager.queuedAsset(queuedAsset);
|
||||||
|
|
||||||
TextureInstancedActor.attachTextureInstancedActor(rVal, foliageType.getGraphicsTemplate().getModel().getPath(), vertexPath, fragmentPath, queuedAsset, drawCount, textureHeight);
|
TextureInstancedActor.attachTextureInstancedActor(rVal, foliageType.getGraphicsTemplate().getModel().getPath(), vertexPath, fragmentPath, queuedAsset, drawCount, textureHeight);
|
||||||
|
|||||||
@ -3,6 +3,8 @@ package electrosphere.engine.assetmanager.queue;
|
|||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
import org.lwjgl.BufferUtils;
|
||||||
|
|
||||||
import electrosphere.engine.Globals;
|
import electrosphere.engine.Globals;
|
||||||
import electrosphere.renderer.texture.Texture;
|
import electrosphere.renderer.texture.Texture;
|
||||||
|
|
||||||
@ -11,6 +13,25 @@ import electrosphere.renderer.texture.Texture;
|
|||||||
*/
|
*/
|
||||||
public class QueuedTexture implements QueuedAsset<Texture> {
|
public class QueuedTexture implements QueuedAsset<Texture> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type of loading to perform with this queued texture
|
||||||
|
*/
|
||||||
|
public static enum QueuedTextureType {
|
||||||
|
/**
|
||||||
|
* Loading raw data as a texture
|
||||||
|
*/
|
||||||
|
DATA_BUFF,
|
||||||
|
/**
|
||||||
|
* Loading an actual image as a texture
|
||||||
|
*/
|
||||||
|
IMG_BUFF,
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type of queued texture
|
||||||
|
*/
|
||||||
|
QueuedTextureType type;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* True if loaded
|
* True if loaded
|
||||||
*/
|
*/
|
||||||
@ -46,34 +67,91 @@ public class QueuedTexture implements QueuedAsset<Texture> {
|
|||||||
*/
|
*/
|
||||||
String promisedPath;
|
String promisedPath;
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates the queued texture object
|
|
||||||
* @param image the image to load to gpu
|
|
||||||
*/
|
|
||||||
public QueuedTexture(BufferedImage image){
|
|
||||||
this.data = image;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates the queued texture object
|
* Creates the queued texture object
|
||||||
* @param buffer The data to buffer
|
* @param buffer The data to buffer
|
||||||
* @param width The width of the buffer
|
* @param width The width of the buffer
|
||||||
* @param height The height of the buffer
|
* @param height The height of the buffer
|
||||||
*/
|
*/
|
||||||
public QueuedTexture(ByteBuffer buffer, int width, int height){
|
public QueuedTexture(QueuedTextureType type, ByteBuffer buffer, int width, int height){
|
||||||
|
this.type = type;
|
||||||
this.buffer = buffer;
|
this.buffer = buffer;
|
||||||
this.width = width;
|
this.width = width;
|
||||||
this.height = height;
|
this.height = height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the queued texture object
|
||||||
|
* @param image the image to load to gpu
|
||||||
|
*/
|
||||||
|
public static QueuedTexture createFromImage(BufferedImage bufferedImage){
|
||||||
|
ByteBuffer data;
|
||||||
|
int width = 1;
|
||||||
|
int height = 1;
|
||||||
|
BufferedImage image_data = bufferedImage;
|
||||||
|
boolean hasTransparency = false;
|
||||||
|
if (
|
||||||
|
image_data.getType() == BufferedImage.TYPE_3BYTE_BGR ||
|
||||||
|
image_data.getType() == BufferedImage.TYPE_INT_RGB
|
||||||
|
){
|
||||||
|
hasTransparency = false;
|
||||||
|
} else if(
|
||||||
|
image_data.getType() == BufferedImage.TYPE_4BYTE_ABGR ||
|
||||||
|
image_data.getType() == BufferedImage.TYPE_INT_ARGB
|
||||||
|
){
|
||||||
|
hasTransparency = true;
|
||||||
|
}
|
||||||
|
width = image_data.getWidth();
|
||||||
|
height = image_data.getHeight();
|
||||||
|
if(hasTransparency){
|
||||||
|
data = BufferUtils.createByteBuffer(width * height * 4);
|
||||||
|
} else {
|
||||||
|
data = BufferUtils.createByteBuffer(width * height * 3);
|
||||||
|
}
|
||||||
|
for(int y = height - 1; y > -1; y--){
|
||||||
|
for(int x = 0; x < width; x++){
|
||||||
|
int color = image_data.getRGB(x, y);
|
||||||
|
|
||||||
|
// data.put((byte)temp.getRed());
|
||||||
|
// data.put((byte)temp.getGreen());
|
||||||
|
// data.put((byte)temp.getBlue());
|
||||||
|
if(hasTransparency){
|
||||||
|
int blue = color & 0xff;
|
||||||
|
int green = (color & 0xff00) >> 8;
|
||||||
|
int red = (color & 0xff0000) >> 16;
|
||||||
|
int alpha = (color & 0xff000000) >>> 24;
|
||||||
|
data.put((byte)red);
|
||||||
|
data.put((byte)green);
|
||||||
|
data.put((byte)blue);
|
||||||
|
data.put((byte)alpha);
|
||||||
|
} else {
|
||||||
|
int blue = color & 0xff;
|
||||||
|
int green = (color & 0xff00) >> 8;
|
||||||
|
int red = (color & 0xff0000) >> 16;
|
||||||
|
data.put((byte)red);
|
||||||
|
data.put((byte)green);
|
||||||
|
data.put((byte)blue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(data.position() > 0){
|
||||||
|
data.flip();
|
||||||
|
}
|
||||||
|
QueuedTexture rVal = new QueuedTexture(QueuedTextureType.IMG_BUFF, data, width, height);
|
||||||
|
rVal.data = bufferedImage;
|
||||||
|
return rVal;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void load() {
|
public void load() {
|
||||||
if(data != null){
|
switch(this.type){
|
||||||
texture = new Texture(Globals.renderingEngine.getOpenGLState(), data);
|
case DATA_BUFF: {
|
||||||
} else if(buffer != null){
|
texture = new Texture(Globals.renderingEngine.getOpenGLState(),buffer,width,height);
|
||||||
texture = new Texture(Globals.renderingEngine.getOpenGLState(),buffer,width,height);
|
this.buffer = null;
|
||||||
this.buffer = null;
|
} break;
|
||||||
|
case IMG_BUFF: {
|
||||||
|
texture = new Texture(Globals.renderingEngine.getOpenGLState(), data, buffer);
|
||||||
|
} break;
|
||||||
}
|
}
|
||||||
hasLoaded = true;
|
hasLoaded = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -79,7 +79,7 @@ public class InitialAssetLoading {
|
|||||||
Globals.profiler.endCpuSample();
|
Globals.profiler.endCpuSample();
|
||||||
|
|
||||||
//queue to asset manager
|
//queue to asset manager
|
||||||
atlasQueuedTexture = new QueuedTexture(image);
|
atlasQueuedTexture = QueuedTexture.createFromImage(image);
|
||||||
Globals.assetManager.queuedAsset(atlasQueuedTexture);
|
Globals.assetManager.queuedAsset(atlasQueuedTexture);
|
||||||
|
|
||||||
|
|
||||||
@ -130,7 +130,7 @@ public class InitialAssetLoading {
|
|||||||
Globals.profiler.endCpuSample();
|
Globals.profiler.endCpuSample();
|
||||||
|
|
||||||
//queue to asset manager
|
//queue to asset manager
|
||||||
atlasQueuedTexture = new QueuedTexture(image);
|
atlasQueuedTexture = QueuedTexture.createFromImage(image);
|
||||||
Globals.assetManager.queuedAsset(atlasQueuedTexture);
|
Globals.assetManager.queuedAsset(atlasQueuedTexture);
|
||||||
|
|
||||||
|
|
||||||
@ -210,7 +210,7 @@ public class InitialAssetLoading {
|
|||||||
Globals.profiler.endCpuSample();
|
Globals.profiler.endCpuSample();
|
||||||
|
|
||||||
//queue to asset manager
|
//queue to asset manager
|
||||||
atlasQueuedTexture = new QueuedTexture(image);
|
atlasQueuedTexture = QueuedTexture.createFromImage(image);
|
||||||
Globals.assetManager.queuedAsset(atlasQueuedTexture);
|
Globals.assetManager.queuedAsset(atlasQueuedTexture);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,6 @@ import electrosphere.renderer.OpenGLState;
|
|||||||
import electrosphere.renderer.RenderingEngine;
|
import electrosphere.renderer.RenderingEngine;
|
||||||
import electrosphere.util.FileUtils;
|
import electrosphere.util.FileUtils;
|
||||||
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
@ -78,6 +77,7 @@ public class Texture {
|
|||||||
Globals.renderingEngine.checkError();
|
Globals.renderingEngine.checkError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
/**
|
/**
|
||||||
* Creates an in engine texture object from a java bufferedimage object
|
* Creates an in engine texture object from a java bufferedimage object
|
||||||
* @param bufferedImage The java bufferedimage object
|
* @param bufferedImage The java bufferedimage object
|
||||||
@ -120,13 +120,27 @@ public class Texture {
|
|||||||
}
|
}
|
||||||
for(int y = height - 1; y > -1; y--){
|
for(int y = height - 1; y > -1; y--){
|
||||||
for(int x = 0; x < width; x++){
|
for(int x = 0; x < width; x++){
|
||||||
Color temp = new Color(image_data.getRGB(x, y), true);
|
int color = image_data.getRGB(x, y);
|
||||||
|
|
||||||
data.put((byte)temp.getRed());
|
// data.put((byte)temp.getRed());
|
||||||
data.put((byte)temp.getGreen());
|
// data.put((byte)temp.getGreen());
|
||||||
data.put((byte)temp.getBlue());
|
// data.put((byte)temp.getBlue());
|
||||||
if(hasTransparency){
|
if(hasTransparency){
|
||||||
data.put((byte)temp.getAlpha());
|
int blue = color & 0xff;
|
||||||
|
int green = (color & 0xff00) >> 8;
|
||||||
|
int red = (color & 0xff0000) >> 16;
|
||||||
|
int alpha = (color & 0xff000000) >>> 24;
|
||||||
|
data.put((byte)red);
|
||||||
|
data.put((byte)green);
|
||||||
|
data.put((byte)blue);
|
||||||
|
data.put((byte)alpha);
|
||||||
|
} else {
|
||||||
|
int blue = color & 0xff;
|
||||||
|
int green = (color & 0xff00) >> 8;
|
||||||
|
int red = (color & 0xff0000) >> 16;
|
||||||
|
data.put((byte)red);
|
||||||
|
data.put((byte)green);
|
||||||
|
data.put((byte)blue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -156,6 +170,62 @@ public class Texture {
|
|||||||
openGlState.glBindTexture(GL_TEXTURE_2D, 0);
|
openGlState.glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an in engine texture object from a java bufferedimage object
|
||||||
|
* @param bufferedImage The java bufferedimage object
|
||||||
|
* @param data The pre-parsed buffer of data from the buffered image
|
||||||
|
*/
|
||||||
|
public Texture(OpenGLState openGlState, BufferedImage bufferedImage, ByteBuffer data){
|
||||||
|
this.texturePointer = GL40.glGenTextures();
|
||||||
|
Globals.renderingEngine.checkError();
|
||||||
|
//bind the new texture
|
||||||
|
openGlState.glBindTexture(GL_TEXTURE_2D, texturePointer);
|
||||||
|
//how are we gonna wrap the texture??
|
||||||
|
this.setWrap(openGlState, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
|
||||||
|
this.setWrap(openGlState, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
|
||||||
|
//set the border color to black
|
||||||
|
this.setBorderColor(openGlState, new float[]{ 0.0f, 0.0f, 0.0f, 1.0f });
|
||||||
|
//set magnification and minification operation sampling strategies
|
||||||
|
this.setMinFilter(openGlState, GL_LINEAR);
|
||||||
|
this.setMagFilter(openGlState, GL_LINEAR);
|
||||||
|
//load the image here
|
||||||
|
BufferedImage image_data = bufferedImage;
|
||||||
|
if (
|
||||||
|
image_data.getType() == BufferedImage.TYPE_3BYTE_BGR ||
|
||||||
|
image_data.getType() == BufferedImage.TYPE_INT_RGB
|
||||||
|
){
|
||||||
|
hasTransparency = false;
|
||||||
|
} else if(
|
||||||
|
image_data.getType() == BufferedImage.TYPE_4BYTE_ABGR ||
|
||||||
|
image_data.getType() == BufferedImage.TYPE_INT_ARGB
|
||||||
|
){
|
||||||
|
hasTransparency = true;
|
||||||
|
}
|
||||||
|
width = image_data.getWidth();
|
||||||
|
height = image_data.getHeight();
|
||||||
|
//call if width != height so opengl figures out how to unpack it properly
|
||||||
|
if(width != height){
|
||||||
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||||
|
}
|
||||||
|
//buffer the texture information
|
||||||
|
if(hasTransparency){
|
||||||
|
this.pixelFormat = GL_RGBA;
|
||||||
|
this.datatype = GL_UNSIGNED_BYTE;
|
||||||
|
this.glTexImage2D(openGlState, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data);
|
||||||
|
} else {
|
||||||
|
this.pixelFormat = GL_RGB;
|
||||||
|
this.datatype = GL_UNSIGNED_BYTE;
|
||||||
|
this.glTexImage2D(openGlState, width, height, GL_RGB, GL_UNSIGNED_BYTE, data);
|
||||||
|
}
|
||||||
|
glGenerateMipmap(GL_TEXTURE_2D);
|
||||||
|
//check build status
|
||||||
|
String errorMessage = RenderingEngine.getErrorInEnglish(Globals.renderingEngine.getError());
|
||||||
|
if(errorMessage != null){
|
||||||
|
LoggerInterface.loggerRenderer.ERROR(new IllegalStateException("Texture Constructor[from bufferedimage]: " + errorMessage));
|
||||||
|
}
|
||||||
|
openGlState.glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a texture from an existing file
|
* Creates a texture from an existing file
|
||||||
* @param path The path to the image file
|
* @param path The path to the image file
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user