cloud work
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good

This commit is contained in:
austin 2024-11-25 15:40:44 -05:00
parent 96753152e6
commit b1230ea07c
9 changed files with 479 additions and 24 deletions

View File

@ -0,0 +1,102 @@
#version 450 core
//macros
#extension GL_ARB_explicit_uniform_location : enable
//output
out vec4 fragColor;
//input
in vec3 FragPos;
in vec3 Normal;
in vec2 TexCoord;
in vec4 projCoord;
in vec4 modelCoord;
//uniforms
uniform float time;
uniform mat4 model;
uniform vec3 viewPos;
const float CONTACT_TEST_MARGIN = -0.001;
/*
Main method
*/
void main(){
float timeS = time * 0.01;
// Normalized pixel coordinates (from 0 to 1)
vec3 projCoordNorm = projCoord.xyz / projCoord.w / 2.0 + 0.5;
//make vec2
vec2 finalProd = projCoordNorm.xy;
//get vector that describes the movement through the cube
vec3 viewDir = normalize(viewPos - FragPos);
//need to transform to model space
//get inverse of model transform
mat4 inverseModel = inverse(model);
//apply to view dir
vec4 modelViewDir = normalize(inverseModel * vec4(viewDir,1.0));
//where the vector first hits the cube
vec4 contactPoint = modelCoord;
float red = 1.0;
float green = 1.0;
float blue = 1.0;
red = modelViewDir.x;
green = modelViewDir.y;
blue = modelViewDir.z;
//need to calculate exit point
//if we hit one of the X edges
vec4 backPoint = vec4(1.0);
if(abs(contactPoint.x)-1.0>CONTACT_TEST_MARGIN){
red = 1.0;
//discard if backface
if(sign(contactPoint.x)!=sign(modelViewDir.x)){
discard;
}
//calculate distance to nearest face
float distX = 2.0;
//this is some really weird logic that I believe works to calculate distance to nearest face
float distY = abs(sign(modelViewDir.y) - contactPoint.y);
float distZ = abs(sign(modelViewDir.z) - contactPoint.z);
//calculate number of times to add viewDir to get dist
float scaleX = distX / modelViewDir.x;
float scaleY = distY / modelViewDir.y;
float scaleZ = distZ / modelViewDir.z;
//this is the smallest distance of all of them
float minScale = min(scaleX,min(scaleY,scaleZ));
backPoint = contactPoint + (modelViewDir * minScale);
float dist = length(abs(vec3(contactPoint) - vec3(backPoint)))/1.0;
red = green = blue = dist;
} else if(abs(contactPoint.y)-1.0>CONTACT_TEST_MARGIN){
green = 1.0;
//discard if backface
if(sign(contactPoint.y)!=sign(modelViewDir.y)){
discard;
}
} else if(abs(contactPoint.z)-1.0>CONTACT_TEST_MARGIN){
blue = 1.0;
//discard if backface
if(sign(contactPoint.z)!=sign(modelViewDir.z)){
discard;
}
}
vec4 color = vec4(
red,
green,
blue,
0.3
);
fragColor = color;
}

View File

@ -0,0 +1,43 @@
#version 450 core
//input buffers
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aNormal;
layout (location = 4) in vec2 aTex;
//coordinate space transformation matrices
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
uniform float time;
//output buffers
out vec3 FragPos;
out vec3 Normal;
out vec2 TexCoord;
out vec4 projCoord;
out vec4 modelCoord;
void main() {
//normalize posiiton and normal
vec4 FinalVertex = vec4(aPos, 1.0);
vec4 FinalNormal = vec4(aNormal, 1.0);
//push frag, normal, and texture positions to fragment shader
FragPos = vec3(model * FinalVertex);
Normal = mat3(transpose(inverse(model))) * aNormal;
TexCoord = aTex;
projCoord = projection * view * model * FinalVertex;
modelCoord = FinalVertex;
//set final position with opengl space
gl_Position = projection * view * model * FinalVertex;
}

View File

@ -1156,6 +1156,11 @@ Convert PhysicsEntityUtils to use generic interface to load tri geom rigid bodie
Fix winding order on block meshes Fix winding order on block meshes
Add texture atlasing to blocks Add texture atlasing to blocks
(!1/25/2024)
Remove unused import
Geometry mesh generation class
Cloud shader
# TODO # TODO

View File

@ -19,6 +19,7 @@ import electrosphere.client.ui.menu.mainmenu.MenuCharacterCreation;
import electrosphere.controls.ControlHandler; import electrosphere.controls.ControlHandler;
import electrosphere.engine.Globals; import electrosphere.engine.Globals;
import electrosphere.engine.assetmanager.AssetDataStrings; import electrosphere.engine.assetmanager.AssetDataStrings;
import electrosphere.engine.assetmanager.queue.QueuedModel;
import electrosphere.engine.signal.Signal.SignalType; import electrosphere.engine.signal.Signal.SignalType;
import electrosphere.engine.threads.LabeledThread.ThreadLabel; import electrosphere.engine.threads.LabeledThread.ThreadLabel;
import electrosphere.entity.DrawableUtils; import electrosphere.entity.DrawableUtils;
@ -30,6 +31,10 @@ import electrosphere.net.NetUtils;
import electrosphere.net.client.ClientNetworking; import electrosphere.net.client.ClientNetworking;
import electrosphere.renderer.actor.Actor; import electrosphere.renderer.actor.Actor;
import electrosphere.renderer.actor.ActorTextureMask; import electrosphere.renderer.actor.ActorTextureMask;
import electrosphere.renderer.meshgen.GeometryMeshGen;
import electrosphere.renderer.model.Mesh;
import electrosphere.renderer.model.Model;
import electrosphere.renderer.shader.VisualShader;
public class ClientLoading { public class ClientLoading {
@ -272,6 +277,22 @@ public class ClientLoading {
cursorActor.addTextureMask(new ActorTextureMask("sphere", Arrays.asList(new String[]{"Textures/transparent_red.png"}))); cursorActor.addTextureMask(new ActorTextureMask("sphere", Arrays.asList(new String[]{"Textures/transparent_red.png"})));
DrawableUtils.makeEntityTransparent(Globals.playerCursor); DrawableUtils.makeEntityTransparent(Globals.playerCursor);
EntityUtils.getScale(Globals.playerCursor).set(0.2f); EntityUtils.getScale(Globals.playerCursor).set(0.2f);
//cloud object
// Entity cloudEnt = EntityCreationUtils.createClientSpatialEntity();
// EntityCreationUtils.makeEntityDrawablePreexistingModel(cloudEnt, Globals.assetManager.queuedAsset(new QueuedModel(() -> {
// Model rVal = new Model();
// Mesh m = GeometryMeshGen.genBox(1, 1, 1);
// //shader logic
// m.setShader(VisualShader.loadSpecificShader("Shaders/entities/clouds/clouds.vs", "Shaders/entities/clouds/clouds.fs"));
// m.setParent(rVal);
// rVal.getMeshes().add(m);
// rVal.setBoundingSphere(0,0,0,2);
// return rVal;
// })));
} }
static final int MAX_DRAW_CELL_WAIT = 1000; static final int MAX_DRAW_CELL_WAIT = 1000;

View File

@ -0,0 +1,277 @@
package electrosphere.renderer.meshgen;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.util.LinkedList;
import java.util.List;
import org.joml.Vector2f;
import org.joml.Vector3f;
import org.lwjgl.BufferUtils;
import electrosphere.renderer.model.Mesh;
public class GeometryMeshGen {
/**
* Meshes a box
* @param verts The list of verts to store into
* @param normals The list of normals to store into
* @param uvs The list of uvs to store into
* @param indices The list of indices to store into
* @param width The width of the box
* @param height The height of the box
* @param depth THe depth of the box
*/
public static Mesh genBox(float width, float height, float depth){
Mesh mesh = new Mesh("box");
mesh.generateVAO();
List<Vector3f> verts = new LinkedList<Vector3f>();
List<Vector3f> normals = new LinkedList<Vector3f>();
List<Vector2f> uvs = new LinkedList<Vector2f>();
List<Integer> indices = new LinkedList<Integer>();
//
//face 1
//
//verts
verts.add(new Vector3f(0, 0, 0));
verts.add(new Vector3f(0 + width, 0, 0));
verts.add(new Vector3f(0, 0 + height, 0));
verts.add(new Vector3f(0 + width, 0 + height, 0));
//indices
indices.add(0);
indices.add(2);
indices.add(3);
indices.add(0);
indices.add(3);
indices.add(1);
//normals
normals.add(new Vector3f(0,0,-1));
normals.add(new Vector3f(0,0,-1));
normals.add(new Vector3f(0,0,-1));
normals.add(new Vector3f(0,0,-1));
//uvs
uvs.add(new Vector2f( 0, 0));
uvs.add(new Vector2f(width, 0));
uvs.add(new Vector2f( 0, height));
uvs.add(new Vector2f(width, height));
//
//face 2
//
//verts
verts.add(new Vector3f(0, 0, 0 ));
verts.add(new Vector3f(0, 0, 0 + depth));
verts.add(new Vector3f(0, 0 + height, 0 ));
verts.add(new Vector3f(0, 0 + height, 0 + depth));
//indices
indices.add(4);
indices.add(7);
indices.add(6);
indices.add(4);
indices.add(5);
indices.add(7);
//normals
normals.add(new Vector3f(-1,0,0));
normals.add(new Vector3f(-1,0,0));
normals.add(new Vector3f(-1,0,0));
normals.add(new Vector3f(-1,0,0));
//uvs
uvs.add(new Vector2f( 0, 0));
uvs.add(new Vector2f(depth, 0));
uvs.add(new Vector2f( 0, height));
uvs.add(new Vector2f(depth, height));
//
//face 3
//
//verts
verts.add(new Vector3f(0, 0, 0 ));
verts.add(new Vector3f(0, 0, 0 + depth));
verts.add(new Vector3f(0 + width, 0, 0 ));
verts.add(new Vector3f(0 + width, 0, 0 + depth));
//indices
indices.add( 8);
indices.add(10);
indices.add(11);
indices.add( 9);
indices.add( 8);
indices.add(11);
//normals
normals.add(new Vector3f(0,-1,0));
normals.add(new Vector3f(0,-1,0));
normals.add(new Vector3f(0,-1,0));
normals.add(new Vector3f(0,-1,0));
//uvs
uvs.add(new Vector2f( 0, 0));
uvs.add(new Vector2f(depth, 0));
uvs.add(new Vector2f( 0, width));
uvs.add(new Vector2f(depth, width));
//
//face 4
//
//verts
verts.add(new Vector3f(0, 0, 0 + depth));
verts.add(new Vector3f(0 + width, 0, 0 + depth));
verts.add(new Vector3f(0, 0 + height, 0 + depth));
verts.add(new Vector3f(0 + width, 0 + height, 0 + depth));
//indices
indices.add(12);
indices.add(15);
indices.add(14);
indices.add(12);
indices.add(13);
indices.add(15);
//normals
normals.add(new Vector3f(0,0,1));
normals.add(new Vector3f(0,0,1));
normals.add(new Vector3f(0,0,1));
normals.add(new Vector3f(0,0,1));
//uvs
uvs.add(new Vector2f( 0, 0));
uvs.add(new Vector2f(width, 0));
uvs.add(new Vector2f( 0, height));
uvs.add(new Vector2f(width, height));
//
//face 5
//
//verts
verts.add(new Vector3f(0 + width, 0, 0 ));
verts.add(new Vector3f(0 + width, 0, 0 + depth));
verts.add(new Vector3f(0 + width, 0 + height, 0 ));
verts.add(new Vector3f(0 + width, 0 + height, 0 + depth));
//indices
indices.add(16);
indices.add(18);
indices.add(19);
indices.add(16);
indices.add(19);
indices.add(17);
//normals
normals.add(new Vector3f(1,0,0));
normals.add(new Vector3f(1,0,0));
normals.add(new Vector3f(1,0,0));
normals.add(new Vector3f(1,0,0));
//uvs
uvs.add(new Vector2f( 0, 0));
uvs.add(new Vector2f(depth, 0));
uvs.add(new Vector2f( 0, height));
uvs.add(new Vector2f(depth, height));
//
//face 6
//
//verts
verts.add(new Vector3f(0, 0 + height, 0 ));
verts.add(new Vector3f(0, 0 + height, 0 + depth));
verts.add(new Vector3f(0 + width, 0 + height, 0 ));
verts.add(new Vector3f(0 + width, 0 + height, 0 + depth));
//indices
indices.add(20);
indices.add(23);
indices.add(22);
indices.add(20);
indices.add(21);
indices.add(23);
//normals
normals.add(new Vector3f(0,1,0));
normals.add(new Vector3f(0,1,0));
normals.add(new Vector3f(0,1,0));
normals.add(new Vector3f(0,1,0));
//uvs
uvs.add(new Vector2f( 0, 0));
uvs.add(new Vector2f(depth, 0));
uvs.add(new Vector2f( 0, width));
uvs.add(new Vector2f(depth, width));
//store into arrays
FloatBuffer vertBuffer;
FloatBuffer normalBuffer;
FloatBuffer uvBuffer;
IntBuffer faceBuffer;
//verts
float[] vertices = new float[verts.size() * 3];
for(int i = 0; i < verts.size(); i++){
Vector3f currentVert = verts.get(i);
vertices[3 * i + 0] = currentVert.x;
vertices[3 * i + 1] = currentVert.y;
vertices[3 * i + 2] = currentVert.z;
}
vertBuffer = BufferUtils.createFloatBuffer(vertices.length);
vertBuffer.put(vertices);
//faces
int[] faceElements = new int[indices.size()];
for(int i = 0; i < indices.size(); i++){
faceElements[i] = indices.get(i);
}
faceBuffer = BufferUtils.createIntBuffer(faceElements.length);
faceBuffer.put(faceElements);
//normals
float[] normalsArr = new float[normals.size() * 3];
for(int i = 0; i < normals.size(); i++){
Vector3f currentNormal = normals.get(i);
normalsArr[3 * i + 0] = currentNormal.x;
normalsArr[3 * i + 1] = currentNormal.y;
normalsArr[3 * i + 2] = currentNormal.z;
}
normalBuffer = BufferUtils.createFloatBuffer(normalsArr.length);
normalBuffer.put(normalsArr);
//uvs
float[] uvsArr = new float[uvs.size() * 2];
for(int i = 0; i < uvs.size(); i++){
Vector2f currentUV = uvs.get(i);
uvsArr[2 * i + 0] = currentUV.x;
uvsArr[2 * i + 1] = currentUV.y;
}
uvBuffer = BufferUtils.createFloatBuffer(uvsArr.length);
uvBuffer.put(uvsArr);
//actually store in mesh
int elementCount = faceElements.length;
try {
//actually buffer vertices
if(vertBuffer.position() > 0){
vertBuffer.flip();
mesh.bufferVertices(vertBuffer, 3);
}
//actually buffer normals
if(normalBuffer != null && normalBuffer.position() > 0){
normalBuffer.flip();
mesh.bufferNormals(normalBuffer, 3);
}
//actually buffer UVs
if(uvBuffer != null && uvBuffer.position() > 0){
uvBuffer.flip();
mesh.bufferTextureCoords(uvBuffer, 2);
}
//buffer element indices
if(faceBuffer.position() > 0){
faceBuffer.flip();
mesh.bufferFaces(faceBuffer, elementCount);
}
} catch (NullPointerException ex){
ex.printStackTrace();
}
return mesh;
}
}

View File

@ -608,6 +608,17 @@ public class Model {
this.boundingSphere = boundingSphere; this.boundingSphere = boundingSphere;
} }
/**
* Sets the bounding sphere
* @param x The x position
* @param y The y position
* @param z The z position
* @param r The radius of the sphere
*/
public void setBoundingSphere(double x, double y, double z, double r){
this.boundingSphere = new Sphered(x,y,z,r);
}
/** /**
* Gets the list of all animations * Gets the list of all animations
* @return The list of all animations * @return The list of all animations

View File

@ -1,13 +1,9 @@
package electrosphere.renderer.ui.font; package electrosphere.renderer.ui.font;
import java.awt.FontFormatException;
import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import electrosphere.engine.Globals; import electrosphere.engine.Globals;
import electrosphere.logger.LoggerInterface;
import electrosphere.util.FileUtils;
/** /**
* Manages all fonts loaded into the engine * Manages all fonts loaded into the engine

View File

@ -105,16 +105,16 @@ public class ServerBlockChunkGenerationThread implements Runnable {
//TODO: generate from macro-level data //TODO: generate from macro-level data
chunk = BlockChunkData.allocate(); chunk = BlockChunkData.allocate();
chunk.setHomogenousValue(0); chunk.setHomogenousValue(0);
if(worldX == 0 && worldY == 0 && worldZ == 0){ // if(worldX == 0 && worldY == 0 && worldZ == 0){
chunk.setHomogenousValue(BlockChunkData.NOT_HOMOGENOUS); // chunk.setHomogenousValue(BlockChunkData.NOT_HOMOGENOUS);
for(int x = 0; x < 16; x++){ // for(int x = 0; x < 16; x++){
for(int y = 0; y < 16; y++){ // for(int y = 0; y < 16; y++){
for(int z = 0; z < 16; z++){ // for(int z = 0; z < 16; z++){
chunk.setType(x, y, z, 1); // chunk.setType(x, y, z, 1);
} // }
} // }
} // }
} // }
} }
if(chunk != null){ if(chunk != null){
chunkCache.add(worldX, worldY, worldZ, stride, chunk); chunkCache.add(worldX, worldY, worldZ, stride, chunk);

View File

@ -121,16 +121,16 @@ public class ServerBlockManager {
returnedChunk.setWorldY(worldY); returnedChunk.setWorldY(worldY);
returnedChunk.setWorldZ(worldZ); returnedChunk.setWorldZ(worldZ);
returnedChunk.setHomogenousValue(0); returnedChunk.setHomogenousValue(0);
if(worldX == 0 && worldY == 0 && worldZ == 0){ // if(worldX == 0 && worldY == 0 && worldZ == 0){
returnedChunk.setHomogenousValue(BlockChunkData.NOT_HOMOGENOUS); // returnedChunk.setHomogenousValue(BlockChunkData.NOT_HOMOGENOUS);
for(int x = 3; x < 16; x++){ // for(int x = 3; x < 16; x++){
for(int y = 8; y < 16; y++){ // for(int y = 8; y < 16; y++){
for(int z = 3; z < 16; z++){ // for(int z = 3; z < 16; z++){
returnedChunk.setType(x, y, z, 1); // returnedChunk.setType(x, y, z, 1);
} // }
} // }
} // }
} // }
} }
this.chunkCache.add(worldX, worldY, worldZ, BlockChunkData.LOD_FULL_RES, returnedChunk); this.chunkCache.add(worldX, worldY, worldZ, BlockChunkData.LOD_FULL_RES, returnedChunk);
} }