Skip to content
This repository has been archived by the owner on Oct 9, 2019. It is now read-only.

Commit

Permalink
New Particle System.
Browse files Browse the repository at this point in the history
  • Loading branch information
Guerra24 committed Nov 29, 2015
1 parent 9b75642 commit 495d0df
Show file tree
Hide file tree
Showing 16 changed files with 461 additions and 23 deletions.
10 changes: 10 additions & 0 deletions assets/shaders/FragmentParticle.glsl
Expand Up @@ -24,5 +24,15 @@

#version 330 core

in vec3 pass_Position;

out vec4 [4] out_Color;

void main(void){

out_Color[0] = vec4(1.0);
out_Color[1] = vec4(pass_Position.xyz,0);
out_Color[2] = vec4(0,1,0,0);
out_Color[3] = vec4(0.0,0.0,0.0,0);

}
10 changes: 10 additions & 0 deletions assets/shaders/VertexParticle.glsl
Expand Up @@ -24,5 +24,15 @@

#version 330 core

in vec2 position;

out vec3 pass_Position;

uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix;

void main(void){
vec4 pos = modelViewMatrix * vec4(position, 0.0, 1.0);
gl_Position = projectionMatrix * pos;
pass_Position = pos.xyz;
}
Expand Up @@ -44,7 +44,7 @@ public class VoxelVariables {
public static final String version = "0.0.9";
public static final String apiVersion = "0.0.4";
public static final String state = "ALPHA";
public static final int build = 126;
public static final int build = 127;
public static int FOV = 90;
public static int WIDTH = 1280;
public static int HEIGHT = 720;
Expand Down Expand Up @@ -78,6 +78,7 @@ public class VoxelVariables {
public static final int CHUNK_HEIGHT = 16;
public static final int DIM_0 = 0;
public static final int DIM_1 = 1;
public static final float GRAVITY = -10;
/**
* Graphics Settings
*/
Expand Down
Expand Up @@ -3,13 +3,14 @@
import net.guerra24.voxel.client.api.API;
import net.guerra24.voxel.client.core.GlobalStates;
import net.guerra24.voxel.client.core.GlobalStates.GameState;
import net.guerra24.voxel.client.core.State;
import net.guerra24.voxel.client.core.Voxel;
import net.guerra24.voxel.client.core.VoxelVariables;
import net.guerra24.voxel.client.graphics.opengl.Display;
import net.guerra24.voxel.client.particle.ParticleMaster;
import net.guerra24.voxel.client.resources.GameResources;
import net.guerra24.voxel.client.resources.GuiResources;
import net.guerra24.voxel.client.world.WorldsHandler;
import net.guerra24.voxel.client.core.State;
import net.guerra24.voxel.client.core.Voxel;
import net.guerra24.voxel.client.core.VoxelVariables;

/**
* Single Player GameState
Expand All @@ -27,10 +28,11 @@ public void update(Voxel voxel, GlobalStates states, float delta) {
API api = voxel.getApi();
Display display = voxel.getDisplay();

worlds.getActiveWorld().updateChunksGeneration(gm, api);
worlds.getActiveWorld().updateChunksGeneration(gm, api, delta);
gm.getPhysics().getMobManager().update(delta, gm, gi, worlds.getActiveWorld(), api);
gm.update(gm.getSkyboxRenderer().update(delta));
gm.getRenderer().getWaterRenderer().update(delta);
ParticleMaster.getInstance().update(delta);

if (!display.isDisplayFocused() && !VoxelVariables.debug) {
gm.getCamera().unlockMouse();
Expand All @@ -56,16 +58,18 @@ public void render(Voxel voxel, GlobalStates states, float delta) {
worlds.getActiveWorld().updateChunksShadow(gm);
gm.getMasterShadowRenderer().end();
}
gm.getPostProcessing().getPost_fbo().begin();
gm.getDeferredShadingRenderer().getPost_fbo().begin();
gm.getRenderer().prepare();
gm.getRenderer().begin(gm);
worlds.getActiveWorld().updateChunksRender(gm);
gm.getRenderer().end(gm);
gm.getSkyboxRenderer().render(VoxelVariables.RED, VoxelVariables.GREEN, VoxelVariables.BLUE, delta, gm);
gm.getRenderer().renderEntity(gm.getPhysics().getMobManager().getMobs(), gm);
gm.getPostProcessing().getPost_fbo().end();
ParticleMaster.getInstance().render(gm.getCamera());
gm.getDeferredShadingRenderer().getPost_fbo().end();

gm.getRenderer().prepare();
gm.getPostProcessing().render(gm);
gm.getDeferredShadingRenderer().render(gm);
}

}
Expand Up @@ -6,6 +6,7 @@
import net.guerra24.voxel.client.core.Voxel;
import net.guerra24.voxel.client.core.VoxelVariables;
import net.guerra24.voxel.client.menu.PauseMenu;
import net.guerra24.voxel.client.particle.ParticleMaster;
import net.guerra24.voxel.client.resources.GameResources;
import net.guerra24.voxel.client.world.WorldsHandler;
import net.guerra24.voxel.universal.util.vector.Vector3f;
Expand Down Expand Up @@ -60,16 +61,17 @@ public void render(Voxel voxel, GlobalStates states, float delta) {
worlds.getActiveWorld().updateChunksShadow(gm);
gm.getMasterShadowRenderer().end();
}
gm.getPostProcessing().getPost_fbo().begin();
gm.getDeferredShadingRenderer().getPost_fbo().begin();
gm.getRenderer().prepare();
gm.getRenderer().begin(gm);
worlds.getActiveWorld().updateChunksRender(gm);
gm.getRenderer().end(gm);
gm.getSkyboxRenderer().render(VoxelVariables.RED, VoxelVariables.GREEN, VoxelVariables.BLUE, delta, gm);
gm.getRenderer().renderEntity(gm.getPhysics().getMobManager().getMobs(), gm);
gm.getPostProcessing().getPost_fbo().end();
ParticleMaster.getInstance().render(gm.getCamera());
gm.getDeferredShadingRenderer().getPost_fbo().end();
gm.getRenderer().prepare();
gm.getPostProcessing().render(gm);
gm.getDeferredShadingRenderer().render(gm);
gm.getGuiRenderer().renderGui(gm.guis4);
}

Expand Down
@@ -0,0 +1,81 @@
package net.guerra24.voxel.client.graphics;

import static org.lwjgl.opengl.GL11.GL_TRIANGLE_STRIP;
import static org.lwjgl.opengl.GL11.glDepthMask;
import static org.lwjgl.opengl.GL11.glDrawArrays;
import static org.lwjgl.opengl.GL20.glDisableVertexAttribArray;
import static org.lwjgl.opengl.GL20.glEnableVertexAttribArray;
import static org.lwjgl.opengl.GL30.glBindVertexArray;

import java.util.Queue;

import net.guerra24.voxel.client.graphics.shaders.ParticleShader;
import net.guerra24.voxel.client.particle.Particle;
import net.guerra24.voxel.client.resources.Loader;
import net.guerra24.voxel.client.resources.models.RawModel;
import net.guerra24.voxel.client.util.Maths;
import net.guerra24.voxel.client.world.entities.Camera;
import net.guerra24.voxel.universal.util.vector.Matrix4f;
import net.guerra24.voxel.universal.util.vector.Vector3f;

public class ParticleRenderer {

private static final float[] VERTICES = { -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f, -0.5f };

private RawModel quad;
private ParticleShader shader;

public ParticleRenderer(Loader loader, Matrix4f projectionMatrix) {
quad = loader.loadToVAO(VERTICES, 2);
shader = new ParticleShader();
shader.start();
shader.loadProjectionMatrix(projectionMatrix);
}

public void render(Queue<Particle> particles, Camera camera) {
Matrix4f viewMatrix = Maths.createViewMatrix(camera);
prepare();
for (Particle particle : particles) {
updateModelViewMatrix(particle.getPosition(), particle.getRotation(), particle.getScale(), viewMatrix);
glDrawArrays(GL_TRIANGLE_STRIP, 0, quad.getVertexCount());
}
finishRendering();
}

private void updateModelViewMatrix(Vector3f position, float rotation, float scale, Matrix4f viewMatrix) {
Matrix4f modelMatrix = new Matrix4f();
Matrix4f.translate(position, modelMatrix, modelMatrix);
modelMatrix.m00 = viewMatrix.m00;
modelMatrix.m01 = viewMatrix.m10;
modelMatrix.m02 = viewMatrix.m20;
modelMatrix.m10 = viewMatrix.m01;
modelMatrix.m11 = viewMatrix.m11;
modelMatrix.m12 = viewMatrix.m21;
modelMatrix.m20 = viewMatrix.m02;
modelMatrix.m21 = viewMatrix.m12;
modelMatrix.m22 = viewMatrix.m22;
Matrix4f.rotate((float) Math.toRadians(rotation), new Vector3f(0, 0, 1), modelMatrix, modelMatrix);
Matrix4f.scale(new Vector3f(scale, scale, scale), modelMatrix, modelMatrix);
Matrix4f modelViewMatrix = Matrix4f.mul(viewMatrix, modelMatrix, null);
shader.loadModelViewMatrix(modelViewMatrix);
}

private void prepare() {
shader.start();
glBindVertexArray(quad.getVaoID());
glEnableVertexAttribArray(0);
glDepthMask(false);
}

private void finishRendering() {
glDepthMask(true);
glDisableVertexAttribArray(0);
glBindVertexArray(0);
shader.stop();
}

public void cleanUp() {
shader.cleanUp();
}

}
@@ -0,0 +1,34 @@
package net.guerra24.voxel.client.graphics.shaders;

import net.guerra24.voxel.client.core.VoxelVariables;
import net.guerra24.voxel.universal.util.vector.Matrix4f;

public class ParticleShader extends ShaderProgram {

private int location_modelViewMatrix;
private int location_projectionMatrix;

public ParticleShader() {
super(VoxelVariables.VERTEX_FILE_PARTICLE, VoxelVariables.FRAGMENT_FILE_PARTICLE);
}

@Override
protected void getAllUniformLocations() {
location_modelViewMatrix = super.getUniformLocation("modelViewMatrix");
location_projectionMatrix = super.getUniformLocation("projectionMatrix");
}

@Override
protected void bindAttributes() {
super.bindAttribute(0, "position");
}

public void loadModelViewMatrix(Matrix4f modelView) {
super.loadMatrix(location_modelViewMatrix, modelView);
}

public void loadProjectionMatrix(Matrix4f projectionMatrix) {
super.loadMatrix(location_projectionMatrix, projectionMatrix);
}

}
49 changes: 49 additions & 0 deletions src/main/java/net/guerra24/voxel/client/particle/Particle.java
@@ -0,0 +1,49 @@
package net.guerra24.voxel.client.particle;

import net.guerra24.voxel.client.core.VoxelVariables;
import net.guerra24.voxel.universal.util.vector.Vector3f;

public class Particle {

private Vector3f position;
private Vector3f velocity;

private float gravityEffect;
private float lifeLeght;
private float rotation;
private float scale;
private float elapsedTime = 0;

public Particle(Vector3f position, Vector3f velocity, float gravityEffect, float lifeLeght, float rotation,
float scale) {
this.position = position;
this.velocity = velocity;
this.gravityEffect = gravityEffect;
this.lifeLeght = lifeLeght;
this.rotation = rotation;
this.scale = scale;
ParticleMaster.getInstance().addParticle(this);
}

public boolean update(float delta) {
velocity.y += VoxelVariables.GRAVITY * gravityEffect * delta;
Vector3f change = new Vector3f(velocity);
change.scale(delta);
Vector3f.add(change, position, position);
elapsedTime += delta;
return elapsedTime < lifeLeght;
}

public Vector3f getPosition() {
return position;
}

public float getRotation() {
return rotation;
}

public float getScale() {
return scale;
}

}
@@ -0,0 +1,57 @@
package net.guerra24.voxel.client.particle;

import java.util.Iterator;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

import net.guerra24.voxel.client.graphics.ParticleRenderer;
import net.guerra24.voxel.client.resources.Loader;
import net.guerra24.voxel.client.world.entities.Camera;
import net.guerra24.voxel.universal.util.vector.Matrix4f;

public class ParticleMaster {

private static ParticleMaster instance = null;

public static ParticleMaster getInstance() {
if (instance == null) {
instance = new ParticleMaster();
}
return instance;
}

private Queue<Particle> particles;
private ParticleRenderer renderer;

private ParticleMaster() {
}

public void init(Loader loader, Matrix4f projectionMatrix) {
particles = new ConcurrentLinkedQueue<Particle>();
renderer = new ParticleRenderer(loader, projectionMatrix);
}

public void update(float delta) {
Iterator<Particle> iterator = particles.iterator();
while (iterator.hasNext()) {
Particle p = iterator.next();
boolean stillAlive = p.update(delta);
if (!stillAlive)
iterator.remove();
}

}

public void render(Camera camera) {
renderer.render(particles, camera);
}

public void cleanUp() {
renderer.cleanUp();
}

public void addParticle(Particle particle) {
particles.add(particle);
}

}
@@ -0,0 +1,15 @@
package net.guerra24.voxel.client.particle;

import net.guerra24.voxel.universal.util.vector.Vector3f;

public class ParticlePoint {
private Vector3f pos;

public ParticlePoint(Vector3f pos) {
this.pos = pos;
}

public Vector3f getPos() {
return pos;
}
}

0 comments on commit 495d0df

Please sign in to comment.