Volumetric rendering
This commit is contained in:
parent
8b966838ef
commit
90aa9fb963
@ -1,165 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
#version 430 core
|
|
||||||
out vec4 FragColor;
|
|
||||||
|
|
||||||
struct Material {
|
|
||||||
sampler2D diffuse;
|
|
||||||
sampler2D specular;
|
|
||||||
float shininess;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DirLight {
|
|
||||||
vec3 direction;
|
|
||||||
|
|
||||||
vec3 ambient;
|
|
||||||
vec3 diffuse;
|
|
||||||
vec3 specular;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct PointLight {
|
|
||||||
vec3 position;
|
|
||||||
|
|
||||||
float constant;
|
|
||||||
float linear;
|
|
||||||
float quadratic;
|
|
||||||
|
|
||||||
vec3 ambient;
|
|
||||||
vec3 diffuse;
|
|
||||||
vec3 specular;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SpotLight {
|
|
||||||
vec3 position;
|
|
||||||
vec3 direction;
|
|
||||||
float cutOff;
|
|
||||||
float outerCutOff;
|
|
||||||
|
|
||||||
float constant;
|
|
||||||
float linear;
|
|
||||||
float quadratic;
|
|
||||||
|
|
||||||
vec3 ambient;
|
|
||||||
vec3 diffuse;
|
|
||||||
vec3 specular;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define NR_POINT_LIGHTS 4
|
|
||||||
|
|
||||||
in vec3 FragPos;
|
|
||||||
in vec3 Normal;
|
|
||||||
in vec2 TexCoords;
|
|
||||||
|
|
||||||
|
|
||||||
uniform int fragHasTexture;
|
|
||||||
|
|
||||||
uniform vec3 viewPos;
|
|
||||||
uniform DirLight dirLight;
|
|
||||||
uniform PointLight pointLights[NR_POINT_LIGHTS];
|
|
||||||
uniform SpotLight spotLight;
|
|
||||||
uniform Material material;
|
|
||||||
|
|
||||||
// function prototypes
|
|
||||||
vec3 CalcDirLight(DirLight light, vec3 normal, vec3 viewDir);
|
|
||||||
vec3 CalcPointLight(PointLight light, vec3 normal, vec3 fragPos, vec3 viewDir);
|
|
||||||
vec3 CalcSpotLight(SpotLight light, vec3 normal, vec3 fragPos, vec3 viewDir);
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
// properties
|
|
||||||
vec3 norm = normalize(Normal);
|
|
||||||
vec3 viewDir = normalize(viewPos - FragPos);
|
|
||||||
|
|
||||||
// == =====================================================
|
|
||||||
// Our lighting is set up in 3 phases: directional, point lights and an optional flashlight
|
|
||||||
// For each phase, a calculate function is defined that calculates the corresponding color
|
|
||||||
// per lamp. In the main() function we take all the calculated colors and sum them up for
|
|
||||||
// this fragment's final color.
|
|
||||||
// == =====================================================
|
|
||||||
// phase 1: directional lighting
|
|
||||||
vec3 result = CalcDirLight(dirLight, norm, viewDir);
|
|
||||||
// phase 2: point lights
|
|
||||||
//for(int i = 0; i < NR_POINT_LIGHTS; i++)
|
|
||||||
// result += CalcPointLight(pointLights[i], norm, FragPos, viewDir);
|
|
||||||
// phase 3: spot light
|
|
||||||
//result += CalcSpotLight(spotLight, norm, FragPos, viewDir);
|
|
||||||
|
|
||||||
FragColor = vec4(result, 1.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// calculates the color when using a directional light.
|
|
||||||
vec3 CalcDirLight(DirLight light, vec3 normal, vec3 viewDir)
|
|
||||||
{
|
|
||||||
vec3 lightDir = normalize(-light.direction);
|
|
||||||
// diffuse shading
|
|
||||||
float diff = max(dot(normal, lightDir), 0.0);
|
|
||||||
// specular shading
|
|
||||||
vec3 reflectDir = reflect(-lightDir, normal);
|
|
||||||
float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
|
|
||||||
// combine results
|
|
||||||
vec3 ambient = vec3(1.0,1.0,1.0);
|
|
||||||
vec3 diffuse = vec3(1.0,1.0,1.0);
|
|
||||||
vec3 specular = vec3(1.0,1.0,1.0);
|
|
||||||
if(fragHasTexture == 1){
|
|
||||||
ambient = light.ambient;// * vec3(texture(material.diffuse, TexCoords));
|
|
||||||
diffuse = light.diffuse * diff;// * vec3(texture(material.diffuse, TexCoords));
|
|
||||||
specular = light.specular * spec;// * vec3(texture(material.specular, TexCoords));
|
|
||||||
} else {
|
|
||||||
ambient = light.ambient;// * vec3(texture(material.diffuse, TexCoords));
|
|
||||||
diffuse = light.diffuse * diff;// * vec3(texture(material.diffuse, TexCoords));
|
|
||||||
specular = light.specular * spec;// * vec3(texture(material.specular, TexCoords));
|
|
||||||
}
|
|
||||||
//vec3 ambient = light.ambient;// * vec3(texture(material.diffuse, TexCoords));
|
|
||||||
//vec3 diffuse = light.diffuse * diff;// * vec3(texture(material.diffuse, TexCoords));
|
|
||||||
//vec3 specular = light.specular * spec;// * vec3(texture(material.specular, TexCoords));
|
|
||||||
return (ambient + diffuse);// + specular);
|
|
||||||
}
|
|
||||||
|
|
||||||
// calculates the color when using a point light.
|
|
||||||
vec3 CalcPointLight(PointLight light, vec3 normal, vec3 fragPos, vec3 viewDir)
|
|
||||||
{
|
|
||||||
vec3 lightDir = normalize(light.position - fragPos);
|
|
||||||
// diffuse shading
|
|
||||||
float diff = max(dot(normal, lightDir), 0.0);
|
|
||||||
// specular shading
|
|
||||||
vec3 reflectDir = reflect(-lightDir, normal);
|
|
||||||
float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
|
|
||||||
// attenuation
|
|
||||||
float distance = length(light.position - fragPos);
|
|
||||||
float attenuation = 1.0 / (light.constant + light.linear * distance + light.quadratic * (distance * distance));
|
|
||||||
// combine results
|
|
||||||
vec3 ambient = light.ambient * vec3(texture(material.diffuse, TexCoords));
|
|
||||||
vec3 diffuse = light.diffuse * diff * vec3(texture(material.diffuse, TexCoords));
|
|
||||||
vec3 specular = light.specular * spec * vec3(texture(material.specular, TexCoords));
|
|
||||||
ambient *= attenuation;
|
|
||||||
diffuse *= attenuation;
|
|
||||||
specular *= attenuation;
|
|
||||||
return (ambient + diffuse + specular);
|
|
||||||
}
|
|
||||||
|
|
||||||
// calculates the color when using a spot light.
|
|
||||||
vec3 CalcSpotLight(SpotLight light, vec3 normal, vec3 fragPos, vec3 viewDir)
|
|
||||||
{
|
|
||||||
vec3 lightDir = normalize(light.position - fragPos);
|
|
||||||
// diffuse shading
|
|
||||||
float diff = max(dot(normal, lightDir), 0.0);
|
|
||||||
// specular shading
|
|
||||||
vec3 reflectDir = reflect(-lightDir, normal);
|
|
||||||
float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
|
|
||||||
// attenuation
|
|
||||||
float distance = length(light.position - fragPos);
|
|
||||||
float attenuation = 1.0 / (light.constant + light.linear * distance + light.quadratic * (distance * distance));
|
|
||||||
// spotlight intensity
|
|
||||||
float theta = dot(lightDir, normalize(-light.direction));
|
|
||||||
float epsilon = light.cutOff - light.outerCutOff;
|
|
||||||
float intensity = clamp((theta - light.outerCutOff) / epsilon, 0.0, 1.0);
|
|
||||||
// combine results
|
|
||||||
vec3 ambient = light.ambient * vec3(texture(material.diffuse, TexCoords));
|
|
||||||
vec3 diffuse = light.diffuse * diff * vec3(texture(material.diffuse, TexCoords));
|
|
||||||
vec3 specular = light.specular * spec * vec3(texture(material.specular, TexCoords));
|
|
||||||
ambient *= attenuation * intensity;
|
|
||||||
diffuse *= attenuation * intensity;
|
|
||||||
specular *= attenuation * intensity;
|
|
||||||
return (ambient + diffuse + specular);
|
|
||||||
}
|
|
||||||
|
|
||||||
@ -1,97 +0,0 @@
|
|||||||
//Vertex Shader
|
|
||||||
#version 430 core
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
layout (location = 0) in vec3 aPos;
|
|
||||||
layout (location = 1) in vec3 aNormal;
|
|
||||||
layout (location = 2) in vec4 aWeights;
|
|
||||||
layout (location = 3) in vec4 aIndex;
|
|
||||||
layout (location = 4) in vec2 aText;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
uniform mat4 transform;
|
|
||||||
uniform mat4 model;
|
|
||||||
uniform mat4 view;
|
|
||||||
uniform mat4 projection;
|
|
||||||
|
|
||||||
|
|
||||||
const int MAX_BONES = 100;
|
|
||||||
uniform mat4 bones[MAX_BONES];
|
|
||||||
uniform int hasBones;
|
|
||||||
uniform int numBones;
|
|
||||||
|
|
||||||
uniform int hasTexture;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
out vec3 Normal;
|
|
||||||
out vec3 FragPos;
|
|
||||||
out vec2 TexCoords;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
vec4 FinalVertex = vec4(aPos, 1.0);
|
|
||||||
vec4 FinalNormal = vec4(aNormal, 0.0);
|
|
||||||
if(hasBones == 1){
|
|
||||||
//mat4 BoneTransform;
|
|
||||||
//for(int i = 0; i < MAX_BONES; i++){
|
|
||||||
// if(i < numBones){
|
|
||||||
// BoneTransform += bones[i] * aWeights[i];
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//vec4 FinalVertex = vec4(aPos, 1.0);
|
|
||||||
//vec4 FinalNormal = vec4(aNormal, 1.0);
|
|
||||||
//mat4 BoneTransform;
|
|
||||||
//BoneTransform = mat4(
|
|
||||||
// 1.0,0.0,0.0,0.0,
|
|
||||||
// 0.0,1.0,0.0,0.0,
|
|
||||||
// 0.0,0.0,1.0,0.0,
|
|
||||||
// 0.0,0.0,0.0,1.0);
|
|
||||||
//BoneTransform = BoneTransform * mat4(
|
|
||||||
// 1.0,0.0,0.0,0.0,
|
|
||||||
// 0.0,1.0,0.0,0.0,
|
|
||||||
// 0.0,0.0,2.0,0.0,
|
|
||||||
// 0.0,0.0,0.0,1.0);
|
|
||||||
//BoneTransform = BoneTransform * bones[aIndex[0]] * aWeights[0];
|
|
||||||
//BoneTransform += bones[aIndex[0]] * 1.0;
|
|
||||||
//BoneTransform += bones[aIndex[1]] * aWeights[1];
|
|
||||||
//BoneTransform += bones[aIndex[2]] * aWeights[2];
|
|
||||||
//BoneTransform += bones[aIndex[3]] * aWeights[3];
|
|
||||||
//FinalVertex = BoneTransform * FinalVertex;
|
|
||||||
vec4 inputVertex = FinalVertex;
|
|
||||||
vec4 inputNormal = FinalNormal;
|
|
||||||
//mat4 BoneTransform;
|
|
||||||
//BoneTransform = bones[int(aIndex[0])] * aWeights[0];
|
|
||||||
//BoneTransform += bones[int(aIndex[1])] * aWeights[1];
|
|
||||||
//BoneTransform += bones[int(aIndex[2])] * aWeights[2];
|
|
||||||
//BoneTransform += bones[int(aIndex[3])] * aWeights[3];
|
|
||||||
//FinalVertex = BoneTransform * inputVertex;
|
|
||||||
//FinalNormal = BoneTransform * inputNormal;
|
|
||||||
FinalVertex = (bones[int(aIndex[0])] * inputVertex) * aWeights[0];
|
|
||||||
FinalVertex = (bones[int(aIndex[1])] * inputVertex) * aWeights[1] + FinalVertex;
|
|
||||||
FinalVertex = (bones[int(aIndex[2])] * inputVertex) * aWeights[2] + FinalVertex;
|
|
||||||
FinalVertex = (bones[int(aIndex[3])] * inputVertex) * aWeights[3] + FinalVertex;
|
|
||||||
FinalNormal = (bones[int(aIndex[0])] * inputNormal) * aWeights[0];
|
|
||||||
FinalNormal = (bones[int(aIndex[1])] * inputNormal) * aWeights[1] + FinalNormal;
|
|
||||||
FinalNormal = (bones[int(aIndex[2])] * inputNormal) * aWeights[2] + FinalNormal;
|
|
||||||
FinalNormal = (bones[int(aIndex[3])] * inputNormal) * aWeights[3] + FinalNormal;
|
|
||||||
} else {
|
|
||||||
//gl_Position = projection * view * model * vec4(aPos, 1.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
vec2 FinalTexture = vec2(1.0,1.0);
|
|
||||||
if(hasTexture == 1){
|
|
||||||
FinalTexture = aText;
|
|
||||||
}
|
|
||||||
TexCoords = FinalTexture;
|
|
||||||
|
|
||||||
FragPos = vec3(model * FinalVertex);
|
|
||||||
Normal = vec3(transpose(inverse(model)) * FinalNormal);
|
|
||||||
gl_Position = projection * view * model * FinalVertex;
|
|
||||||
}
|
|
||||||
255
assets/Shaders/flame2/flame.fs
Normal file
255
assets/Shaders/flame2/flame.fs
Normal file
@ -0,0 +1,255 @@
|
|||||||
|
/*
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2022 railgunSR
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
THIS MAKES USE OF OPENSIMPLEX2, A NOISE ALGORITHM CREATED BY THE FINE FOLKS
|
||||||
|
OVER AT https://github.com/KdotJPG/OpenSimplex2
|
||||||
|
PLEASE GIVE THEM SOME LOVE.
|
||||||
|
|
||||||
|
THE FLAME FUNCTION IS ONE CREATED BY ME BLENDING A LOG2 INTO A EXPONENTIAL.
|
||||||
|
*/
|
||||||
|
|
||||||
|
//version
|
||||||
|
#version 330 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;
|
||||||
|
|
||||||
|
//uniforms
|
||||||
|
uniform float time;
|
||||||
|
|
||||||
|
//layout uniforms
|
||||||
|
layout (location = 5) uniform sampler2D volumeDepthFrontface;
|
||||||
|
layout (location = 6) uniform sampler2D volumeDepthBackface;
|
||||||
|
|
||||||
|
//function declarations
|
||||||
|
vec4 openSimplex2_ImproveXY(vec3 X);
|
||||||
|
float flameTex(float x, float y);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Main method
|
||||||
|
*/
|
||||||
|
void main(){
|
||||||
|
|
||||||
|
float timeS = time * 0.003;
|
||||||
|
|
||||||
|
// Normalized pixel coordinates (from 0 to 1)
|
||||||
|
// vec2 uv = vec2(TexCoord.x,TexCoord.y);
|
||||||
|
|
||||||
|
vec3 projCoordNorm = projCoord.xyz / projCoord.w / 2.0 + 0.5;
|
||||||
|
|
||||||
|
// vec2 finalProd = vec2((projCoord.x + 1.0)/2.0, (projCoord.y + 1.0)/2.0);
|
||||||
|
vec2 finalProd = projCoordNorm.xy;
|
||||||
|
|
||||||
|
// float closeDepth = texture(volumeDepthFrontface, projCoordNorm.xy).r;
|
||||||
|
// float farDepth = texture(volumeDepthBackface, projCoordNorm.xy).r;
|
||||||
|
|
||||||
|
float closeDepth = texture(volumeDepthFrontface, finalProd.xy).r;
|
||||||
|
float farDepth = texture(volumeDepthBackface, finalProd.xy).r;
|
||||||
|
|
||||||
|
// float closeDepth = texture(volumeDepthFrontface, uv).r;
|
||||||
|
// float farDepth = texture(volumeDepthBackface, uv).r;
|
||||||
|
|
||||||
|
|
||||||
|
float dist = farDepth - closeDepth;
|
||||||
|
|
||||||
|
float red = 0;
|
||||||
|
float green = 0;
|
||||||
|
float blue = 0;
|
||||||
|
|
||||||
|
// if(projCoordNorm.x > -0.4 && projCoordNorm.x < 0.6 && projCoordNorm.y > -0.4 && projCoordNorm.y < 0.1){
|
||||||
|
// dist = 0.1;
|
||||||
|
// green = 1;
|
||||||
|
// blue = closeDepth;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if(closeDepth != 1){
|
||||||
|
// blue = 1;
|
||||||
|
// }
|
||||||
|
// val = dist;
|
||||||
|
|
||||||
|
// red = projCoordNorm.x;
|
||||||
|
// green = projCoordNorm.y;
|
||||||
|
// blue = 0;
|
||||||
|
|
||||||
|
// if(mod(TexCoord.x,0.01) < 0.005){
|
||||||
|
// red = 1;
|
||||||
|
// }
|
||||||
|
// if(mod(TexCoord.y,0.01) < 0.005){
|
||||||
|
// green = 1;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if(dist != 0){
|
||||||
|
// red = 1;
|
||||||
|
// green = 1;
|
||||||
|
// blue = 1;
|
||||||
|
// }
|
||||||
|
|
||||||
|
red = dist;
|
||||||
|
green = dist;
|
||||||
|
blue = dist;
|
||||||
|
|
||||||
|
vec4 color = vec4(
|
||||||
|
red,
|
||||||
|
green,
|
||||||
|
blue,
|
||||||
|
1.0
|
||||||
|
);
|
||||||
|
|
||||||
|
// if(val < 0.3){
|
||||||
|
// discard;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Output to screen
|
||||||
|
fragColor = color;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
//custom flame function
|
||||||
|
///
|
||||||
|
|
||||||
|
float flameTex(float x, float y){
|
||||||
|
//flip y
|
||||||
|
float t = 1.0 - y;
|
||||||
|
//calculate vertical component
|
||||||
|
float verticalFlameValue = pow(log(t+1.0),1.4) - step(0.5,t) * (pow((2.0 * (t - 0.5)),3.0) / pow(log(2.0),1.4));
|
||||||
|
//calculate dist along horizontal from vertical component
|
||||||
|
float dist = abs(x-0.5);
|
||||||
|
//want to fade to nothing at dist >= vertical flame value
|
||||||
|
//use exponent to get there
|
||||||
|
//clamp range with min
|
||||||
|
float v = max(2.0 * (verticalFlameValue - dist),0.0);
|
||||||
|
//apply exponent to get value
|
||||||
|
float rVal = pow(v,1.4);
|
||||||
|
return rVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//////////////// K.jpg's Re-oriented 4-Point BCC Noise (OpenSimplex2) ////////////////
|
||||||
|
////////////////////// Output: vec4(dF/dx, dF/dy, dF/dz, value) //////////////////////
|
||||||
|
|
||||||
|
// Inspired by Stefan Gustavson's noise
|
||||||
|
vec4 permute(vec4 t) {
|
||||||
|
return t * (t * 34.0 + 133.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gradient set is a normalized expanded rhombic dodecahedron
|
||||||
|
vec3 grad(float hash) {
|
||||||
|
|
||||||
|
// Random vertex of a cube, +/- 1 each
|
||||||
|
vec3 cube = mod(floor(hash / vec3(1.0, 2.0, 4.0)), 2.0) * 2.0 - 1.0;
|
||||||
|
|
||||||
|
// Random edge of the three edges connected to that vertex
|
||||||
|
// Also a cuboctahedral vertex
|
||||||
|
// And corresponds to the face of its dual, the rhombic dodecahedron
|
||||||
|
vec3 cuboct = cube;
|
||||||
|
cuboct[int(hash / 16.0)] = 0.0;
|
||||||
|
|
||||||
|
// In a funky way, pick one of the four points on the rhombic face
|
||||||
|
float type = mod(floor(hash / 8.0), 2.0);
|
||||||
|
vec3 rhomb = (1.0 - type) * cube + type * (cuboct + cross(cube, cuboct));
|
||||||
|
|
||||||
|
// Expand it so that the new edges are the same length
|
||||||
|
// as the existing ones
|
||||||
|
vec3 grad = cuboct * 1.22474487139 + rhomb;
|
||||||
|
|
||||||
|
// To make all gradients the same length, we only need to shorten the
|
||||||
|
// second type of vector. We also put in the whole noise scale constant.
|
||||||
|
// The compiler should reduce it into the existing floats. I think.
|
||||||
|
grad *= (1.0 - 0.042942436724648037 * type) * 32.80201376986577;
|
||||||
|
|
||||||
|
return grad;
|
||||||
|
}
|
||||||
|
|
||||||
|
// BCC lattice split up into 2 cube lattices
|
||||||
|
vec4 openSimplex2Base(vec3 X) {
|
||||||
|
|
||||||
|
// First half-lattice, closest edge
|
||||||
|
vec3 v1 = round(X);
|
||||||
|
vec3 d1 = X - v1;
|
||||||
|
vec3 score1 = abs(d1);
|
||||||
|
vec3 dir1 = step(max(score1.yzx, score1.zxy), score1);
|
||||||
|
vec3 v2 = v1 + dir1 * sign(d1);
|
||||||
|
vec3 d2 = X - v2;
|
||||||
|
|
||||||
|
// Second half-lattice, closest edge
|
||||||
|
vec3 X2 = X + 144.5;
|
||||||
|
vec3 v3 = round(X2);
|
||||||
|
vec3 d3 = X2 - v3;
|
||||||
|
vec3 score2 = abs(d3);
|
||||||
|
vec3 dir2 = step(max(score2.yzx, score2.zxy), score2);
|
||||||
|
vec3 v4 = v3 + dir2 * sign(d3);
|
||||||
|
vec3 d4 = X2 - v4;
|
||||||
|
|
||||||
|
// Gradient hashes for the four points, two from each half-lattice
|
||||||
|
vec4 hashes = permute(mod(vec4(v1.x, v2.x, v3.x, v4.x), 289.0));
|
||||||
|
hashes = permute(mod(hashes + vec4(v1.y, v2.y, v3.y, v4.y), 289.0));
|
||||||
|
hashes = mod(permute(mod(hashes + vec4(v1.z, v2.z, v3.z, v4.z), 289.0)), 48.0);
|
||||||
|
|
||||||
|
// Gradient extrapolations & kernel function
|
||||||
|
vec4 a = max(0.5 - vec4(dot(d1, d1), dot(d2, d2), dot(d3, d3), dot(d4, d4)), 0.0);
|
||||||
|
vec4 aa = a * a; vec4 aaaa = aa * aa;
|
||||||
|
vec3 g1 = grad(hashes.x); vec3 g2 = grad(hashes.y);
|
||||||
|
vec3 g3 = grad(hashes.z); vec3 g4 = grad(hashes.w);
|
||||||
|
vec4 extrapolations = vec4(dot(d1, g1), dot(d2, g2), dot(d3, g3), dot(d4, g4));
|
||||||
|
|
||||||
|
// Derivatives of the noise
|
||||||
|
vec3 derivative = -8.0 * mat4x3(d1, d2, d3, d4) * (aa * a * extrapolations)
|
||||||
|
+ mat4x3(g1, g2, g3, g4) * aaaa;
|
||||||
|
|
||||||
|
// Return it all as a vec4
|
||||||
|
return vec4(derivative, dot(aaaa, extrapolations));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use this if you don't want Z to look different from X and Y
|
||||||
|
vec4 openSimplex2_Conventional(vec3 X) {
|
||||||
|
|
||||||
|
// Rotate around the main diagonal. Not a skew transform.
|
||||||
|
vec4 result = openSimplex2Base(dot(X, vec3(2.0/3.0)) - X);
|
||||||
|
return vec4(dot(result.xyz, vec3(2.0/3.0)) - result.xyz, result.w);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use this if you want to show X and Y in a plane, then use Z for time, vertical, etc.
|
||||||
|
vec4 openSimplex2_ImproveXY(vec3 X) {
|
||||||
|
|
||||||
|
// Rotate so Z points down the main diagonal. Not a skew transform.
|
||||||
|
mat3 orthonormalMap = mat3(
|
||||||
|
0.788675134594813, -0.211324865405187, -0.577350269189626,
|
||||||
|
-0.211324865405187, 0.788675134594813, -0.577350269189626,
|
||||||
|
0.577350269189626, 0.577350269189626, 0.577350269189626);
|
||||||
|
|
||||||
|
vec4 result = openSimplex2Base(orthonormalMap * X);
|
||||||
|
return vec4(result.xyz * orthonormalMap, result.w);
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////// End noise code ////////////////////////////////
|
||||||
43
assets/Shaders/flame2/flame.vs
Normal file
43
assets/Shaders/flame2/flame.vs
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
//Vertex Shader
|
||||||
|
#version 330 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;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
|
||||||
|
//set final position with opengl space
|
||||||
|
gl_Position = projection * view * model * FinalVertex;
|
||||||
|
}
|
||||||
@ -1,13 +0,0 @@
|
|||||||
//Fragment Shader
|
|
||||||
#version 330 core
|
|
||||||
|
|
||||||
|
|
||||||
out vec4 FragColor;
|
|
||||||
|
|
||||||
uniform vec3 objectColor;
|
|
||||||
uniform vec3 lightColor;
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
FragColor = vec4(1.0);
|
|
||||||
}
|
|
||||||
@ -1,68 +0,0 @@
|
|||||||
//Vertex Shader
|
|
||||||
#version 430 core
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
layout (location = 0) in vec3 aPos;
|
|
||||||
layout (location = 1) in vec3 aNormal;
|
|
||||||
layout (location = 2) in vec4 aWeights;
|
|
||||||
layout (location = 3) in ivec4 aIndex;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
uniform mat4 transform;
|
|
||||||
uniform mat4 model;
|
|
||||||
uniform mat4 view;
|
|
||||||
uniform mat4 projection;
|
|
||||||
|
|
||||||
|
|
||||||
const int MAX_BONES = 100;
|
|
||||||
uniform mat4 bones[MAX_BONES];
|
|
||||||
uniform int hasBones;
|
|
||||||
uniform int numBones;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
out vec3 Normal;
|
|
||||||
out vec3 FragPos;
|
|
||||||
out vec2 TexCoords;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
if(hasBones == 1){
|
|
||||||
//mat4 BoneTransform;
|
|
||||||
//for(int i = 0; i < MAX_BONES; i++){
|
|
||||||
// if(i < numBones){
|
|
||||||
// BoneTransform += bones[i] * aWeights[i];
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
mat4 BoneTransform;
|
|
||||||
BoneTransform = mat4(
|
|
||||||
1.0,0.0,0.0,0.0,
|
|
||||||
0.0,1.0,0.0,0.0,
|
|
||||||
0.0,0.0,1.0,0.0,
|
|
||||||
0.0,0.0,0.0,1.0);
|
|
||||||
//BoneTransform = BoneTransform * mat4(
|
|
||||||
// 1.0,0.0,0.0,0.0,
|
|
||||||
// 0.0,1.0,0.0,0.0,
|
|
||||||
// 0.0,0.0,2.0,0.0,
|
|
||||||
// 0.0,0.0,0.0,1.0);
|
|
||||||
BoneTransform = BoneTransform * bones[aIndex[0]] * aWeights[0];
|
|
||||||
BoneTransform += BoneTransform * bones[aIndex[1]] * aWeights[1];
|
|
||||||
BoneTransform += BoneTransform * bones[aIndex[2]] * aWeights[2];
|
|
||||||
BoneTransform += BoneTransform * bones[aIndex[3]] * aWeights[3];
|
|
||||||
//BoneTransform += bones[aIndex[0]] * 1.0;
|
|
||||||
//BoneTransform += bones[aIndex[1]] * aWeights[1];
|
|
||||||
//BoneTransform += bones[aIndex[2]] * aWeights[2];
|
|
||||||
//BoneTransform += bones[aIndex[3]] * aWeights[3];
|
|
||||||
gl_Position = projection * view * model * BoneTransform * vec4(aPos, 1.0);
|
|
||||||
} else {
|
|
||||||
gl_Position = projection * view * model * vec4(aPos, 1.0);
|
|
||||||
}
|
|
||||||
FragPos = vec3(model * vec4(aPos, 1.0));
|
|
||||||
Normal = vec3(vec4(aNormal, 1.0));
|
|
||||||
TexCoords = vec2(0.5, 0.5);
|
|
||||||
}
|
|
||||||
@ -1,61 +0,0 @@
|
|||||||
//Vertex Shader
|
|
||||||
#version 330 core
|
|
||||||
layout (location = 0) in vec3 aPos;
|
|
||||||
//layout (location = 1) in vec3 aColor;
|
|
||||||
//layout (location = 1) in vec2 aTexCoord;
|
|
||||||
//layout (location = 2) in vec3 aNormal;
|
|
||||||
|
|
||||||
//out vec3 ourColor;
|
|
||||||
|
|
||||||
//uniform vec3 offset;
|
|
||||||
|
|
||||||
uniform mat4 transform;
|
|
||||||
uniform mat4 model;
|
|
||||||
uniform mat4 view;
|
|
||||||
uniform mat4 projection;
|
|
||||||
|
|
||||||
//out vec3 ourPos;
|
|
||||||
//out vec2 TexCoord;
|
|
||||||
//out vec3 FragPos;
|
|
||||||
//out vec3 Normal;
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
//gl_Position = vec4(aPos, 1.0);
|
|
||||||
gl_Position = projection * view * model * vec4(aPos, 1.0);
|
|
||||||
//ourColor = aColor;
|
|
||||||
//FragPos = vec3(model * vec4(aPos, 1.0));
|
|
||||||
//TexCoord = aTexCoord;
|
|
||||||
//Normal = mat3(transpose(inverse(model))) * aNormal;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Fragment Shader
|
|
||||||
#version 330 core
|
|
||||||
|
|
||||||
|
|
||||||
out vec4 FragColor;
|
|
||||||
|
|
||||||
//in vec3 ourColor;
|
|
||||||
|
|
||||||
//in vec2 TexCoord;
|
|
||||||
//uniform sampler2D ourTexture1;
|
|
||||||
//uniform sampler2D ourTexture2;
|
|
||||||
//in vec3 Normal;
|
|
||||||
//uniform vec3 lightPos;
|
|
||||||
//in vec3 FragPos;
|
|
||||||
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
//vec3 lightColor = vec3(1.0, 1.0, 1.0);
|
|
||||||
//vec3 norm = normalize(Normal);
|
|
||||||
//vec3 lightDir = normalize(lightPos - FragPos);
|
|
||||||
//float diff = max(dot(Normal, lightDir), 0.0);
|
|
||||||
//vec3 diffuse = diff * lightColor;
|
|
||||||
//vec3 result = diffuse * objectColor;
|
|
||||||
//FragColor = mix(texture(ourTexture1, TexCoord), texture(ourTexture2, TexCoord), 0.2);// - (vec4(diffuse, 1.0)*0.2);// * vec4(ourColor, 1.0);
|
|
||||||
FragColor = vec4(0.5, 0.5, 0.5, 1.0);
|
|
||||||
}
|
|
||||||
@ -1,34 +0,0 @@
|
|||||||
//Fragment Shader
|
|
||||||
#version 330 core
|
|
||||||
|
|
||||||
in vec3 FragPos;
|
|
||||||
in vec3 Normal;
|
|
||||||
|
|
||||||
uniform vec3 objectColor;
|
|
||||||
uniform vec3 lightColor;
|
|
||||||
uniform vec3 lightPos;
|
|
||||||
uniform vec3 viewPos;
|
|
||||||
|
|
||||||
out vec4 FragColor;
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
//Diffuse calculations..
|
|
||||||
vec3 norm = normalize(Normal);
|
|
||||||
vec3 lightDir = normalize(lightPos - FragPos);
|
|
||||||
float diff = max(dot(norm, lightDir), 0.0);
|
|
||||||
vec3 diffuse = diff * lightColor;
|
|
||||||
//Ambient Light
|
|
||||||
float ambientStrength = 0.5;
|
|
||||||
vec3 ambient = ambientStrength * lightColor;
|
|
||||||
//Specular calculations..
|
|
||||||
float specularStrength = 0.5;
|
|
||||||
vec3 viewDir = normalize(viewPos - FragPos);
|
|
||||||
vec3 reflectDir = reflect(-lightDir, norm);
|
|
||||||
float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);
|
|
||||||
vec3 specular = specularStrength * spec * lightColor;
|
|
||||||
//result color
|
|
||||||
vec3 result = (ambient + diffuse + specular) * objectColor;
|
|
||||||
//push output color
|
|
||||||
FragColor = vec4(result, 1.0);
|
|
||||||
}
|
|
||||||
37
assets/Shaders/volumeBuffer/volumetric.fs
Normal file
37
assets/Shaders/volumeBuffer/volumetric.fs
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
#version 330 core
|
||||||
|
|
||||||
|
uniform float linearCoef;
|
||||||
|
uniform float quadCoef;
|
||||||
|
|
||||||
|
uniform float near;
|
||||||
|
uniform float far;
|
||||||
|
|
||||||
|
float LinearizeDepth(float depth);
|
||||||
|
|
||||||
|
void main(){
|
||||||
|
// float coord = gl_FragCoord.x;
|
||||||
|
// if(coord != 1){
|
||||||
|
// gl_FragDepth = 0;
|
||||||
|
// } else {
|
||||||
|
// gl_FragDepth = 1;
|
||||||
|
// }
|
||||||
|
|
||||||
|
float depthRaw = gl_FragCoord.z;
|
||||||
|
|
||||||
|
// if(depthRaw != 1){
|
||||||
|
// depthRaw = 0;
|
||||||
|
// }
|
||||||
|
|
||||||
|
float finalValue = LinearizeDepth(depthRaw) / sqrt(far);//min(depthRaw * linearCoef + depthRaw * depthRaw * quadCoef,1);
|
||||||
|
|
||||||
|
gl_FragDepth = finalValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
//Util
|
||||||
|
//
|
||||||
|
float LinearizeDepth(float depth){
|
||||||
|
float z = depth * 2.0 - 1.0; // back to NDC
|
||||||
|
return (2.0 * near * far) / (far + near - z * (far - near));
|
||||||
|
}
|
||||||
40
assets/Shaders/volumeBuffer/volumetric.vs
Normal file
40
assets/Shaders/volumeBuffer/volumetric.vs
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#version 330 core
|
||||||
|
|
||||||
|
layout (location = 0) in vec3 aPos;
|
||||||
|
layout (location = 2) in vec4 aWeights;
|
||||||
|
layout (location = 3) in vec4 aIndex;
|
||||||
|
|
||||||
|
uniform mat4 model;
|
||||||
|
uniform mat4 view;
|
||||||
|
uniform mat4 projection;
|
||||||
|
|
||||||
|
//bone related variables
|
||||||
|
const int MAX_WEIGHTS = 4;
|
||||||
|
const int MAX_BONES = 100;
|
||||||
|
uniform mat4 bones[MAX_BONES];
|
||||||
|
uniform int numBones;
|
||||||
|
uniform int hasBones;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
//calculate bone transform
|
||||||
|
mat4 BoneTransform = (bones[int(aIndex[0])] * aWeights[0]);
|
||||||
|
BoneTransform = BoneTransform + (bones[int(aIndex[1])] * aWeights[1]);
|
||||||
|
BoneTransform = BoneTransform + (bones[int(aIndex[2])] * aWeights[2]);
|
||||||
|
BoneTransform = BoneTransform + (bones[int(aIndex[3])] * aWeights[3]);
|
||||||
|
|
||||||
|
|
||||||
|
//apply bone transform to position vectors
|
||||||
|
vec4 FinalVertex = BoneTransform * vec4(aPos, 1.0);
|
||||||
|
|
||||||
|
|
||||||
|
//make sure the W component is 1.0
|
||||||
|
FinalVertex = vec4(FinalVertex.xyz, 1.0);
|
||||||
|
|
||||||
|
//have to account for if dont have bones
|
||||||
|
if(hasBones == 0){
|
||||||
|
FinalVertex = vec4(aPos, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
gl_Position = projection * view * model * FinalVertex;
|
||||||
|
}
|
||||||
@ -24,6 +24,7 @@ import electrosphere.menu.WindowStrings;
|
|||||||
import electrosphere.menu.WindowUtils;
|
import electrosphere.menu.WindowUtils;
|
||||||
import electrosphere.menu.MenuCallbacks;
|
import electrosphere.menu.MenuCallbacks;
|
||||||
import electrosphere.menu.MenuGenerators;
|
import electrosphere.menu.MenuGenerators;
|
||||||
|
import electrosphere.renderer.RenderingEngine;
|
||||||
import electrosphere.renderer.ui.DrawableElement;
|
import electrosphere.renderer.ui.DrawableElement;
|
||||||
import electrosphere.renderer.ui.Element;
|
import electrosphere.renderer.ui.Element;
|
||||||
import electrosphere.renderer.ui.Window;
|
import electrosphere.renderer.ui.Window;
|
||||||
@ -765,10 +766,12 @@ public class ControlHandler {
|
|||||||
void setInGameDebugControls(){
|
void setInGameDebugControls(){
|
||||||
mainGameDebugControlList.add(controls.get(DATA_STRING_INPUT_CODE_DEBUG_SPAWN_ITEM));
|
mainGameDebugControlList.add(controls.get(DATA_STRING_INPUT_CODE_DEBUG_SPAWN_ITEM));
|
||||||
controls.get(DATA_STRING_INPUT_CODE_DEBUG_SPAWN_ITEM).setOnPress(new ControlMethod(){public void execute(){
|
controls.get(DATA_STRING_INPUT_CODE_DEBUG_SPAWN_ITEM).setOnPress(new ControlMethod(){public void execute(){
|
||||||
Entity bow = ItemUtils.spawnBasicItem("shorts1");
|
RenderingEngine.incrementOutputFramebuffer();
|
||||||
EntityUtils.getPosition(bow).set(1, 5, 2);
|
// Entity bow = ItemUtils.spawnBasicItem("shorts1");
|
||||||
CollisionObjUtils.positionCharacter(bow, new Vector3f(1, 5, 2));
|
// EntityUtils.getPosition(bow).set(1, 5, 2);
|
||||||
|
// CollisionObjUtils.positionCharacter(bow, new Vector3f(1, 5, 2));
|
||||||
}});
|
}});
|
||||||
|
// RenderingEngine.incrementOutputFramebuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
void setMenuNavigationControls(){
|
void setMenuNavigationControls(){
|
||||||
|
|||||||
@ -3,6 +3,7 @@ package electrosphere.engine;
|
|||||||
import electrosphere.collision.dispatch.CollisionObject;
|
import electrosphere.collision.dispatch.CollisionObject;
|
||||||
import electrosphere.controls.ControlHandler;
|
import electrosphere.controls.ControlHandler;
|
||||||
import electrosphere.entity.Entity;
|
import electrosphere.entity.Entity;
|
||||||
|
import electrosphere.entity.EntityDataStrings;
|
||||||
import electrosphere.entity.EntityUtils;
|
import electrosphere.entity.EntityUtils;
|
||||||
import electrosphere.entity.state.ApplyRotationTree;
|
import electrosphere.entity.state.ApplyRotationTree;
|
||||||
import electrosphere.game.collision.CollisionEngine;
|
import electrosphere.game.collision.CollisionEngine;
|
||||||
@ -40,10 +41,13 @@ import electrosphere.menu.WindowUtils;
|
|||||||
import electrosphere.net.NetUtils;
|
import electrosphere.net.NetUtils;
|
||||||
import electrosphere.net.client.ClientNetworking;
|
import electrosphere.net.client.ClientNetworking;
|
||||||
import electrosphere.net.server.Server;
|
import electrosphere.net.server.Server;
|
||||||
|
import electrosphere.renderer.Mesh;
|
||||||
import electrosphere.renderer.Model;
|
import electrosphere.renderer.Model;
|
||||||
import electrosphere.renderer.RenderUtils;
|
import electrosphere.renderer.RenderUtils;
|
||||||
import electrosphere.renderer.actor.Actor;
|
import electrosphere.renderer.actor.Actor;
|
||||||
|
import electrosphere.renderer.actor.ActorTextureMask;
|
||||||
import electrosphere.renderer.actor.ActorUtils;
|
import electrosphere.renderer.actor.ActorUtils;
|
||||||
|
import electrosphere.renderer.texture.Texture;
|
||||||
import electrosphere.engine.assetmanager.AssetDataStrings;
|
import electrosphere.engine.assetmanager.AssetDataStrings;
|
||||||
import electrosphere.game.client.targeting.crosshair.Crosshair;
|
import electrosphere.game.client.targeting.crosshair.Crosshair;
|
||||||
import electrosphere.game.server.ai.creature.OpportunisticAttacker;
|
import electrosphere.game.server.ai.creature.OpportunisticAttacker;
|
||||||
@ -55,6 +59,8 @@ import electrosphere.renderer.ui.DrawableElement;
|
|||||||
import electrosphere.renderer.ui.WidgetUtils;
|
import electrosphere.renderer.ui.WidgetUtils;
|
||||||
import electrosphere.renderer.ui.Window;
|
import electrosphere.renderer.ui.Window;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.concurrent.Semaphore;
|
import java.util.concurrent.Semaphore;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
@ -679,36 +685,28 @@ public class LoadingThread extends Thread {
|
|||||||
Actor fireActor = EntityUtils.getActor(fire);
|
Actor fireActor = EntityUtils.getActor(fire);
|
||||||
fireActor.maskShader("particleBillboard", "Shaders/flame1/flame.vs", "Shaders/flame1/flame.fs");
|
fireActor.maskShader("particleBillboard", "Shaders/flame1/flame.vs", "Shaders/flame1/flame.fs");
|
||||||
Globals.assetManager.addShaderToQueue("Shaders/flame1/flame.vs", "Shaders/flame1/flame.fs");
|
Globals.assetManager.addShaderToQueue("Shaders/flame1/flame.vs", "Shaders/flame1/flame.fs");
|
||||||
//corner flame 1
|
|
||||||
fire = ParticleUtils.spawnStaticBillboardParticle();
|
|
||||||
EntityUtils.getPosition(fire).set(new Vector3f(1.05f,0.1f,0.95f));
|
|
||||||
EntityUtils.getScale(fire).set(0.4f);
|
|
||||||
fireActor = EntityUtils.getActor(fire);
|
|
||||||
fireActor.maskShader("particleBillboard", "Shaders/flame1/flame.vs", "Shaders/flame1/flame.fs");
|
|
||||||
//corner flame 2
|
|
||||||
fire = ParticleUtils.spawnStaticBillboardParticle();
|
|
||||||
EntityUtils.getPosition(fire).set(new Vector3f(1.05f,0.1f,1.05f));
|
|
||||||
EntityUtils.getScale(fire).set(0.4f);
|
|
||||||
fireActor = EntityUtils.getActor(fire);
|
|
||||||
fireActor.maskShader("particleBillboard", "Shaders/flame1/flame.vs", "Shaders/flame1/flame.fs");
|
|
||||||
//corner flame 3
|
|
||||||
fire = ParticleUtils.spawnStaticBillboardParticle();
|
|
||||||
EntityUtils.getPosition(fire).set(new Vector3f(0.95f,0.1f,0.95f));
|
|
||||||
EntityUtils.getScale(fire).set(0.4f);
|
|
||||||
fireActor = EntityUtils.getActor(fire);
|
|
||||||
fireActor.maskShader("particleBillboard", "Shaders/flame1/flame.vs", "Shaders/flame1/flame.fs");
|
|
||||||
//corner flame 4
|
|
||||||
fire = ParticleUtils.spawnStaticBillboardParticle();
|
|
||||||
EntityUtils.getPosition(fire).set(new Vector3f(0.95f,0.1f,1.05f));
|
|
||||||
EntityUtils.getScale(fire).set(0.4f);
|
|
||||||
fireActor = EntityUtils.getActor(fire);
|
|
||||||
fireActor.maskShader("particleBillboard", "Shaders/flame1/flame.vs", "Shaders/flame1/flame.fs");
|
|
||||||
|
|
||||||
//campfire
|
//campfire
|
||||||
Entity campfire = EntityUtils.spawnDrawableEntity("Models/campfire1.fbx");
|
Entity campfire = EntityUtils.spawnDrawableEntity("Models/campfire1.fbx");
|
||||||
EntityUtils.getPosition(campfire).set(1,0,1);
|
EntityUtils.getPosition(campfire).set(1,0,1);
|
||||||
EntityUtils.getRotation(campfire).rotationX(-(float)Math.PI/2.0f);
|
EntityUtils.getRotation(campfire).rotationX(-(float)Math.PI/2.0f);
|
||||||
|
|
||||||
|
Entity cube = EntityUtils.spawnDrawableEntity("Models/unitcube.fbx");
|
||||||
|
//shader mask
|
||||||
|
EntityUtils.getActor(cube).maskShader("Cube", "Shaders/flame2/flame.vs", "Shaders/flame2/flame.fs");
|
||||||
|
Globals.assetManager.addShaderToQueue("Shaders/flame2/flame.vs", "Shaders/flame2/flame.fs");
|
||||||
|
//texture mask
|
||||||
|
List<Texture> textureList = new LinkedList<Texture>();
|
||||||
|
textureList.add(Globals.renderingEngine.getVolumeFrontfaceTexture());
|
||||||
|
textureList.add(Globals.renderingEngine.getVolumeBackfaceTexture());
|
||||||
|
List<String> uniformList = new LinkedList<String>();
|
||||||
|
uniformList.add("volumeDepthFrontface");
|
||||||
|
uniformList.add("volumeDepthBackface");
|
||||||
|
ActorTextureMask textureMask = new ActorTextureMask("Cube",textureList,uniformList);
|
||||||
|
EntityUtils.getActor(cube).addTextureMask(textureMask);
|
||||||
|
//set draw volumetric
|
||||||
|
cube.putData(EntityDataStrings.DRAW_VOLUMETRIC, true);
|
||||||
|
|
||||||
// goblin = CreatureUtils.spawnBasicCreature("Goblin");
|
// goblin = CreatureUtils.spawnBasicCreature("Goblin");
|
||||||
// CollisionObjUtils.positionCharacter(goblin, new Vector3f(3, 0, 4));
|
// CollisionObjUtils.positionCharacter(goblin, new Vector3f(3, 0, 4));
|
||||||
// EntityUtils.getScale(goblin).set(0.005f);
|
// EntityUtils.getScale(goblin).set(0.005f);
|
||||||
|
|||||||
@ -17,6 +17,7 @@ public class EntityDataStrings {
|
|||||||
public static final String DATA_STRING_ACTOR = "actor";
|
public static final String DATA_STRING_ACTOR = "actor";
|
||||||
public static final String DATA_STRING_DRAW = "drawFlag";
|
public static final String DATA_STRING_DRAW = "drawFlag";
|
||||||
public static final String DRAW_CAST_SHADOW = "castShadow";
|
public static final String DRAW_CAST_SHADOW = "castShadow";
|
||||||
|
public static final String DRAW_VOLUMETRIC = "drawVolumetric";
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@ -15,8 +15,13 @@ import electrosphere.renderer.Model;
|
|||||||
import electrosphere.renderer.ModelUtils;
|
import electrosphere.renderer.ModelUtils;
|
||||||
import electrosphere.renderer.RenderUtils;
|
import electrosphere.renderer.RenderUtils;
|
||||||
import electrosphere.renderer.ShaderProgram;
|
import electrosphere.renderer.ShaderProgram;
|
||||||
|
import electrosphere.renderer.actor.ActorTextureMask;
|
||||||
import electrosphere.renderer.texture.Texture;
|
import electrosphere.renderer.texture.Texture;
|
||||||
import electrosphere.util.Utilities;
|
import electrosphere.util.Utilities;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.joml.Quaternionf;
|
import org.joml.Quaternionf;
|
||||||
import org.joml.Vector3f;
|
import org.joml.Vector3f;
|
||||||
|
|
||||||
@ -96,13 +101,19 @@ public class DrawCell {
|
|||||||
}
|
}
|
||||||
Model terrainModel = RenderUtils.createMinimizedTerrainModelPrecomputedShader(heightmap, texturemap, program, stride);
|
Model terrainModel = RenderUtils.createMinimizedTerrainModelPrecomputedShader(heightmap, texturemap, program, stride);
|
||||||
Mesh terrainMesh = terrainModel.meshes.get(0);
|
Mesh terrainMesh = terrainModel.meshes.get(0);
|
||||||
terrainMesh.useTextureList = true;
|
List<Texture> textureList = new LinkedList<Texture>();
|
||||||
terrainMesh.textureList.add(groundTextureOne);
|
textureList.add(groundTextureOne);
|
||||||
terrainMesh.textureList.add(groundTextureTwo);
|
textureList.add(groundTextureTwo);
|
||||||
terrainMesh.textureList.add(groundTextureThree);
|
textureList.add(groundTextureThree);
|
||||||
terrainMesh.textureList.add(groundTextureFour);
|
textureList.add(groundTextureFour);
|
||||||
|
List<String> uniformList = new LinkedList<String>();
|
||||||
|
uniformList.add("groundTextures[0]");
|
||||||
|
uniformList.add("groundTextures[1]");
|
||||||
|
uniformList.add("groundTextures[2]");
|
||||||
|
uniformList.add("groundTextures[3]");
|
||||||
String terrainModelPath = Globals.assetManager.registerModel(terrainModel);
|
String terrainModelPath = Globals.assetManager.registerModel(terrainModel);
|
||||||
modelEntity = EntityUtils.spawnDrawableEntity(terrainModelPath);
|
modelEntity = EntityUtils.spawnDrawableEntity(terrainModelPath);
|
||||||
|
EntityUtils.getActor(modelEntity).addTextureMask(new ActorTextureMask("terrain",textureList,uniformList));
|
||||||
modelEntity.putData(EntityDataStrings.TERRAIN_IS_TERRAIN, true);
|
modelEntity.putData(EntityDataStrings.TERRAIN_IS_TERRAIN, true);
|
||||||
modelEntity.putData(EntityDataStrings.DRAW_CAST_SHADOW, true);
|
modelEntity.putData(EntityDataStrings.DRAW_CAST_SHADOW, true);
|
||||||
LoggerInterface.loggerRenderer.INFO("New cell @ " + cellX * dynamicInterpolationRatio + "," + cellY * dynamicInterpolationRatio);
|
LoggerInterface.loggerRenderer.INFO("New cell @ " + cellX * dynamicInterpolationRatio + "," + cellY * dynamicInterpolationRatio);
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import electrosphere.entity.types.camera.CameraEntityUtils;
|
|||||||
import electrosphere.logger.LoggerInterface;
|
import electrosphere.logger.LoggerInterface;
|
||||||
import electrosphere.main.Globals;
|
import electrosphere.main.Globals;
|
||||||
import electrosphere.main.Main;
|
import electrosphere.main.Main;
|
||||||
|
import electrosphere.renderer.actor.ActorTextureMask;
|
||||||
import electrosphere.renderer.light.LightManager;
|
import electrosphere.renderer.light.LightManager;
|
||||||
import electrosphere.renderer.texture.Texture;
|
import electrosphere.renderer.texture.Texture;
|
||||||
import java.nio.FloatBuffer;
|
import java.nio.FloatBuffer;
|
||||||
@ -81,9 +82,7 @@ public class Mesh {
|
|||||||
boolean hasBones = true;
|
boolean hasBones = true;
|
||||||
public boolean hasTextureCoords = true;
|
public boolean hasTextureCoords = true;
|
||||||
|
|
||||||
public List<Texture> textureList = new ArrayList<Texture>();
|
public ActorTextureMask textureMask;
|
||||||
public boolean useTextureList;
|
|
||||||
public String textureListArrayUniformName;
|
|
||||||
|
|
||||||
public float vertexMinX;
|
public float vertexMinX;
|
||||||
public float vertexMaxX;
|
public float vertexMaxX;
|
||||||
@ -609,10 +608,8 @@ public class Mesh {
|
|||||||
glEnableVertexAttribArray(attribIndex);
|
glEnableVertexAttribArray(attribIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTextureList(List<Texture> textureList, String uniformName){
|
public void setTextureMask(ActorTextureMask textureMask){
|
||||||
this.textureList = textureList;
|
this.textureMask = textureMask;
|
||||||
useTextureList = true;
|
|
||||||
textureListArrayUniformName = uniformName;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMaterial(Material input){
|
public void setMaterial(Material input){
|
||||||
@ -774,7 +771,7 @@ public class Mesh {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(useMaterial && !useTextureList){
|
if(useMaterial && textureMask == null){
|
||||||
if(material == null){
|
if(material == null){
|
||||||
Globals.materialDefault.apply_material(0,1);
|
Globals.materialDefault.apply_material(0,1);
|
||||||
GL20.glUniform1i(glGetUniformLocation(Globals.renderingEngine.getActiveShader().shaderProgram, "hasTransparency"), 0);
|
GL20.glUniform1i(glGetUniformLocation(Globals.renderingEngine.getActiveShader().shaderProgram, "hasTransparency"), 0);
|
||||||
@ -796,18 +793,18 @@ public class Mesh {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(useTextureList){
|
if(textureMask != null){
|
||||||
int i = 0;
|
int i = 0;
|
||||||
// glUniform1i(glGetUniformLocation(Globals.renderingEngine.getActiveShader().shaderProgram, "groundTextures"), 5);
|
// glUniform1i(glGetUniformLocation(Globals.renderingEngine.getActiveShader().shaderProgram, "groundTextures"), 5);
|
||||||
// for(int j = 1; j < 15; j++){
|
// for(int j = 1; j < 15; j++){
|
||||||
// textureList.get(0).bind(j);
|
// textureList.get(0).bind(j);
|
||||||
// }
|
// }
|
||||||
for(Texture texture : textureList){
|
for(Texture texture : textureMask.getTextures()){
|
||||||
// System.out.println(texture.getPath() + " => groundTextures[" + i + "]" + "=>" + (i));
|
// System.out.println(texture.getPath() + " => groundTextures[" + i + "]" + "=>" + (i));
|
||||||
if(texture != null){
|
if(texture != null){
|
||||||
texture.bind(5+i);
|
texture.bind(5+i);
|
||||||
}
|
}
|
||||||
glUniform1i(glGetUniformLocation(Globals.renderingEngine.getActiveShader().shaderProgram, "groundTextures[" + i + "]"),5+i);
|
glUniform1i(glGetUniformLocation(Globals.renderingEngine.getActiveShader().shaderProgram, textureMask.getUniformNames().get(i)),5+i);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
// for(int j = i; j < 10; j++){
|
// for(int j = i; j < 10; j++){
|
||||||
|
|||||||
@ -3,6 +3,7 @@ package electrosphere.renderer;
|
|||||||
import electrosphere.renderer.actor.ActorAnimationMask;
|
import electrosphere.renderer.actor.ActorAnimationMask;
|
||||||
import electrosphere.renderer.actor.ActorMeshMask;
|
import electrosphere.renderer.actor.ActorMeshMask;
|
||||||
import electrosphere.renderer.actor.ActorShaderMask;
|
import electrosphere.renderer.actor.ActorShaderMask;
|
||||||
|
import electrosphere.renderer.actor.ActorTextureMask;
|
||||||
import electrosphere.renderer.anim.AnimChannel;
|
import electrosphere.renderer.anim.AnimChannel;
|
||||||
import electrosphere.renderer.anim.Animation;
|
import electrosphere.renderer.anim.Animation;
|
||||||
import electrosphere.renderer.anim.AnimNode;
|
import electrosphere.renderer.anim.AnimNode;
|
||||||
@ -61,6 +62,7 @@ public class Model {
|
|||||||
AnimNode root_anim_node;
|
AnimNode root_anim_node;
|
||||||
ActorMeshMask meshMask;
|
ActorMeshMask meshMask;
|
||||||
Map<String,ActorShaderMask> shaderMask = new HashMap<String,ActorShaderMask>();
|
Map<String,ActorShaderMask> shaderMask = new HashMap<String,ActorShaderMask>();
|
||||||
|
Map<String,ActorTextureMask> textureMap = null;
|
||||||
|
|
||||||
public static Model createModelFromAiscene(AIScene s){
|
public static Model createModelFromAiscene(AIScene s){
|
||||||
Model rVal = new Model();
|
Model rVal = new Model();
|
||||||
@ -203,10 +205,19 @@ public class Model {
|
|||||||
while(mesh_Iterator.hasNext()){
|
while(mesh_Iterator.hasNext()){
|
||||||
Mesh currentMesh = mesh_Iterator.next();
|
Mesh currentMesh = mesh_Iterator.next();
|
||||||
if(!meshMask.isBlockedMesh(currentMesh.nodeID)){
|
if(!meshMask.isBlockedMesh(currentMesh.nodeID)){
|
||||||
|
//set shader
|
||||||
ShaderProgram original = currentMesh.shader;
|
ShaderProgram original = currentMesh.shader;
|
||||||
ShaderProgram shader = getCorrectShader(shaderMask, currentMesh, currentMesh.shader);
|
ShaderProgram shader = getCorrectShader(shaderMask, currentMesh, currentMesh.shader);
|
||||||
currentMesh.shader = shader;
|
currentMesh.shader = shader;
|
||||||
|
//set texture mask
|
||||||
|
if(this.textureMap != null && textureMap.containsKey(currentMesh.nodeID)){
|
||||||
|
currentMesh.setTextureMask(textureMap.get(currentMesh.nodeID));
|
||||||
|
}
|
||||||
|
//draw
|
||||||
currentMesh.complexDraw(setShader, bufferStandardUniforms, bufferNonStandardUniforms, useMaterial, useShadowMap, setBones, useLight);
|
currentMesh.complexDraw(setShader, bufferStandardUniforms, bufferNonStandardUniforms, useMaterial, useShadowMap, setBones, useLight);
|
||||||
|
//reset texture mask
|
||||||
|
currentMesh.setTextureMask(null);
|
||||||
|
//reset shader
|
||||||
currentMesh.shader = original;
|
currentMesh.shader = original;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -483,4 +494,8 @@ public class Model {
|
|||||||
public void setMeshMask(ActorMeshMask meshMask){
|
public void setMeshMask(ActorMeshMask meshMask){
|
||||||
this.meshMask = meshMask;
|
this.meshMask = meshMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setTextureMask(Map<String,ActorTextureMask> textureMask){
|
||||||
|
this.textureMap = textureMask;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -57,6 +57,9 @@ import static org.lwjgl.glfw.GLFW.glfwWindowHint;
|
|||||||
import org.lwjgl.glfw.GLFWWindowSizeCallbackI;
|
import org.lwjgl.glfw.GLFWWindowSizeCallbackI;
|
||||||
import org.lwjgl.opengl.GL;
|
import org.lwjgl.opengl.GL;
|
||||||
import org.lwjgl.opengl.GL11;
|
import org.lwjgl.opengl.GL11;
|
||||||
|
import org.lwjgl.opengl.GL15;
|
||||||
|
import org.lwjgl.opengl.GL20;
|
||||||
|
|
||||||
import static org.lwjgl.opengl.GL11.GL_BLEND;
|
import static org.lwjgl.opengl.GL11.GL_BLEND;
|
||||||
import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
|
import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
|
||||||
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
|
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
|
||||||
@ -112,6 +115,17 @@ public class RenderingEngine {
|
|||||||
|
|
||||||
static ShaderProgram lightDepthShaderProgram;
|
static ShaderProgram lightDepthShaderProgram;
|
||||||
static Framebuffer lightDepthBuffer;
|
static Framebuffer lightDepthBuffer;
|
||||||
|
|
||||||
|
static Matrix4f nearVolumeProjectionMatrix = new Matrix4f();
|
||||||
|
static Matrix4f midVolumeProjectionMatrix = new Matrix4f();
|
||||||
|
static Matrix4f farVolumeProjectionMatrix = new Matrix4f();
|
||||||
|
static ShaderProgram volumeDepthShaderProgram;
|
||||||
|
static Framebuffer volumeDepthBackfaceFramebuffer;
|
||||||
|
static Texture volumeDepthBackfaceTexture;
|
||||||
|
static Framebuffer volumeDepthFrontfaceFramebuffer;
|
||||||
|
static Texture volumeDepthFrontfaceTexture;
|
||||||
|
static float volumeDepthLinearCoef = 0.1f;
|
||||||
|
static float volumeDepthQuadCoef = 0.01f;
|
||||||
|
|
||||||
// public static boolean renderHitboxes = false;
|
// public static boolean renderHitboxes = false;
|
||||||
// public static boolean renderPhysics = false;
|
// public static boolean renderPhysics = false;
|
||||||
@ -121,6 +135,8 @@ public class RenderingEngine {
|
|||||||
static float currentViewPlanarAngle;
|
static float currentViewPlanarAngle;
|
||||||
|
|
||||||
ShaderProgram activeProgram;
|
ShaderProgram activeProgram;
|
||||||
|
|
||||||
|
static int outputFramebuffer = 0;
|
||||||
|
|
||||||
|
|
||||||
public void createOpenglContext(){
|
public void createOpenglContext(){
|
||||||
@ -210,13 +226,28 @@ public class RenderingEngine {
|
|||||||
screenFramebuffer = FramebufferUtils.generateScreensizeTextureFramebuffer();
|
screenFramebuffer = FramebufferUtils.generateScreensizeTextureFramebuffer();
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, GL_DEFAULT_FRAMEBUFFER);
|
glBindFramebuffer(GL_FRAMEBUFFER, GL_DEFAULT_FRAMEBUFFER);
|
||||||
glBindRenderbuffer(GL_RENDERBUFFER, GL_DEFAULT_RENDERBUFFER);
|
glBindRenderbuffer(GL_RENDERBUFFER, GL_DEFAULT_RENDERBUFFER);
|
||||||
|
|
||||||
|
//
|
||||||
|
//create light depth framebuffer/shader for shadowmapping
|
||||||
|
//
|
||||||
lightDepthShaderProgram = ShaderProgram.loadSpecificShader("/Shaders/lightDepth/lightDepth.vs", "/Shaders/lightDepth/lightDepth.fs");
|
lightDepthShaderProgram = ShaderProgram.loadSpecificShader("/Shaders/lightDepth/lightDepth.vs", "/Shaders/lightDepth/lightDepth.fs");
|
||||||
Globals.depthMapShaderProgramLoc = lightDepthShaderProgram.shaderProgram;
|
Globals.depthMapShaderProgramLoc = lightDepthShaderProgram.shaderProgram;
|
||||||
lightDepthBuffer = FramebufferUtils.generateDepthBuffer();
|
lightDepthBuffer = FramebufferUtils.generateDepthBuffer();
|
||||||
Globals.shadowMapTextureLoc = lightDepthBuffer.getTexturePointer();
|
Globals.shadowMapTextureLoc = lightDepthBuffer.getTexturePointer();
|
||||||
// glEnable(GL_CULL_FACE); // enabled for shadow mapping
|
// glEnable(GL_CULL_FACE); // enabled for shadow mapping
|
||||||
|
|
||||||
|
//
|
||||||
|
//create volume depth framebuffer/shader for volumetric rendering
|
||||||
|
//
|
||||||
|
volumeDepthShaderProgram = ShaderProgram.loadSpecificShader("/Shaders/volumeBuffer/volumetric.vs", "/Shaders/volumeBuffer/volumetric.fs");
|
||||||
|
volumeDepthBackfaceTexture = FramebufferUtils.generateDepthBufferTexture(Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
||||||
|
volumeDepthBackfaceFramebuffer = FramebufferUtils.generateDepthBuffer(Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT, volumeDepthBackfaceTexture);
|
||||||
|
volumeDepthFrontfaceTexture = FramebufferUtils.generateDepthBufferTexture(Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
||||||
|
volumeDepthFrontfaceFramebuffer = FramebufferUtils.generateDepthBuffer(Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT, volumeDepthFrontfaceTexture);
|
||||||
|
//projection matrices
|
||||||
|
nearVolumeProjectionMatrix.setPerspective((float)(Globals.verticalFOV * Math.PI /180.0f), (float)Globals.WINDOW_WIDTH / (float)Globals.WINDOW_HEIGHT, 0.1f, 100);
|
||||||
|
// midVolumeProjectionMatrix.setPerspective((float)(Globals.verticalFOV * Math.PI /180.0f), (float)Globals.WINDOW_WIDTH / (float)Globals.WINDOW_HEIGHT, 0.01f, 7);
|
||||||
|
// farVolumeProjectionMatrix.setPerspective((float)(Globals.verticalFOV * Math.PI /180.0f), (float)Globals.WINDOW_WIDTH / (float)Globals.WINDOW_HEIGHT, 0.1f, 50);
|
||||||
|
|
||||||
|
|
||||||
//instantiate light manager
|
//instantiate light manager
|
||||||
@ -302,17 +333,26 @@ public class RenderingEngine {
|
|||||||
if(Globals.RENDER_FLAG_RENDER_SHADOW_MAP){
|
if(Globals.RENDER_FLAG_RENDER_SHADOW_MAP){
|
||||||
renderShadowMapContent();
|
renderShadowMapContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
render volume buffer
|
||||||
|
*/
|
||||||
|
if(Globals.RENDER_FLAG_RENDER_SCREEN_FRAMEBUFFER_CONTENT){
|
||||||
|
updateVolumeBuffer();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Update light buffer
|
Update light buffer
|
||||||
*/
|
*/
|
||||||
lightManager.updateData();
|
lightManager.updateData();
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Render content to the game framebuffer
|
Render content to the game framebuffer
|
||||||
*/
|
*/
|
||||||
if(Globals.RENDER_FLAG_RENDER_SCREEN_FRAMEBUFFER_CONTENT){
|
if(Globals.RENDER_FLAG_RENDER_SCREEN_FRAMEBUFFER_CONTENT){
|
||||||
renderGameContent();
|
renderGameContent();
|
||||||
|
renderDebugContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -500,6 +540,13 @@ public class RenderingEngine {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// glBindVertexArray(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void renderDebugContent(){
|
||||||
|
Matrix4f modelTransformMatrix = new Matrix4f();
|
||||||
if(Globals.userSettings.graphicsDebugDrawCollisionSpheres()){
|
if(Globals.userSettings.graphicsDebugDrawCollisionSpheres()){
|
||||||
for(Entity currentHitbox : Globals.hitboxManager.getAllHitboxes()){
|
for(Entity currentHitbox : Globals.hitboxManager.getAllHitboxes()){
|
||||||
if((boolean)currentHitbox.getData(EntityDataStrings.DATA_STRING_DRAW)){
|
if((boolean)currentHitbox.getData(EntityDataStrings.DATA_STRING_DRAW)){
|
||||||
@ -645,10 +692,6 @@ public class RenderingEngine {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// glBindVertexArray(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void renderScreenFramebuffer(){
|
static void renderScreenFramebuffer(){
|
||||||
@ -681,8 +724,15 @@ public class RenderingEngine {
|
|||||||
Globals.renderingEngine.setActiveShader(screenTextureShaders);
|
Globals.renderingEngine.setActiveShader(screenTextureShaders);
|
||||||
glBindVertexArray(screenTextureVAO);
|
glBindVertexArray(screenTextureVAO);
|
||||||
//aaa
|
//aaa
|
||||||
glBindTexture(GL_TEXTURE_2D, screenFramebuffer.getTexturePointer());
|
if(outputFramebuffer == 0){
|
||||||
// glBindTexture(GL_TEXTURE_2D, lightDepthBuffer.getTexturePointer());
|
glBindTexture(GL_TEXTURE_2D, screenFramebuffer.getTexturePointer());
|
||||||
|
} else if(outputFramebuffer == 1){
|
||||||
|
glBindTexture(GL_TEXTURE_2D, lightDepthBuffer.getTexturePointer());
|
||||||
|
} else if(outputFramebuffer == 2){
|
||||||
|
glBindTexture(GL_TEXTURE_2D, volumeDepthBackfaceTexture.getTexturePointer());
|
||||||
|
} else if(outputFramebuffer == 3){
|
||||||
|
glBindTexture(GL_TEXTURE_2D, volumeDepthFrontfaceTexture.getTexturePointer());
|
||||||
|
}
|
||||||
glDrawArrays(GL_TRIANGLES, 0, 6);
|
glDrawArrays(GL_TRIANGLES, 0, 6);
|
||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
}
|
}
|
||||||
@ -709,6 +759,140 @@ public class RenderingEngine {
|
|||||||
// uiActor.drawUI();
|
// uiActor.drawUI();
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void updateVolumeBuffer(){
|
||||||
|
Matrix4f modelTransformMatrix = new Matrix4f();
|
||||||
|
|
||||||
|
//set the viewport to shadow map size
|
||||||
|
glViewport(0, 0, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
|
//stop rendering front faces
|
||||||
|
GL15.glEnable(GL15.GL_CULL_FACE);
|
||||||
|
GL15.glCullFace(GL15.GL_FRONT);
|
||||||
|
|
||||||
|
Globals.renderingEngine.setActiveShader(volumeDepthShaderProgram);
|
||||||
|
|
||||||
|
volumeDepthBackfaceFramebuffer.bind();
|
||||||
|
glClear(GL_DEPTH_BUFFER_BIT);
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
// glBindTexture(GL_TEXTURE_2D, woodTexture);
|
||||||
|
// renderScene(simpleDepthShader);
|
||||||
|
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(Globals.renderingEngine.getActiveShader().shaderProgram, "view"), false, Globals.viewMatrix.get(new float[16]));
|
||||||
|
// glUniformMatrix4fv(glGetUniformLocation(Globals.renderingEngine.getActiveShader().shaderProgram, "projection"), false, Globals.projectionMatrix.get(new float[16]));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
GL20.glUniform1f(glGetUniformLocation(Globals.renderingEngine.getActiveShader().shaderProgram, "linearCoef"), volumeDepthLinearCoef);
|
||||||
|
GL20.glUniform1f(glGetUniformLocation(Globals.renderingEngine.getActiveShader().shaderProgram, "quadCoef"), volumeDepthQuadCoef);
|
||||||
|
|
||||||
|
GL20.glUniform1f(glGetUniformLocation(Globals.renderingEngine.getActiveShader().shaderProgram, "near"), 0.1f);
|
||||||
|
GL20.glUniform1f(glGetUniformLocation(Globals.renderingEngine.getActiveShader().shaderProgram, "far"), 100f);
|
||||||
|
|
||||||
|
// glCullFace(GL_FRONT);
|
||||||
|
|
||||||
|
//
|
||||||
|
// D R A W A L L E N T I T I E S
|
||||||
|
//
|
||||||
|
Vector3f cameraPos = CameraEntityUtils.getCameraCenter(Globals.playerCamera);
|
||||||
|
for(Entity currentEntity : Globals.entityManager.getDrawable()){
|
||||||
|
Vector3d position = EntityUtils.getPosition(currentEntity);
|
||||||
|
if(
|
||||||
|
(boolean)currentEntity.getData(EntityDataStrings.DATA_STRING_DRAW) &&
|
||||||
|
drawPoint(cameraPos,new Vector3f((float)position.x,(float)position.y,(float)position.z)) &&
|
||||||
|
currentEntity.getDataKeys().contains(EntityDataStrings.DRAW_VOLUMETRIC)
|
||||||
|
){
|
||||||
|
//fetch actor
|
||||||
|
Actor currentActor = EntityUtils.getActor(currentEntity);
|
||||||
|
//calculate camera-modified vector3f
|
||||||
|
Vector3f cameraModifiedPosition = new Vector3f((float)position.x,(float)position.y,(float)position.z).sub(CameraEntityUtils.getCameraCenter(Globals.playerCamera));
|
||||||
|
//set projection matrix
|
||||||
|
// if(cameraModifiedPosition.length() > 2f){
|
||||||
|
// glUniformMatrix4fv(glGetUniformLocation(Globals.renderingEngine.getActiveShader().shaderProgram, "projection"), false, farVolumeProjectionMatrix.get(new float[16]));
|
||||||
|
// } else if(cameraModifiedPosition.length() > 0.5f){
|
||||||
|
// glUniformMatrix4fv(glGetUniformLocation(Globals.renderingEngine.getActiveShader().shaderProgram, "projection"), false, midVolumeProjectionMatrix.get(new float[16]));
|
||||||
|
// } else {
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(Globals.renderingEngine.getActiveShader().shaderProgram, "projection"), false, nearVolumeProjectionMatrix.get(new float[16]));
|
||||||
|
// }
|
||||||
|
// glUniformMatrix4fv(glGetUniformLocation(Globals.renderingEngine.getActiveShader().shaderProgram, "projection"), false, Globals.projectionMatrix.get(new float[16]));
|
||||||
|
//calculate and apply model transform
|
||||||
|
modelTransformMatrix = modelTransformMatrix.identity();
|
||||||
|
modelTransformMatrix.translate(cameraModifiedPosition);
|
||||||
|
modelTransformMatrix.rotate(EntityUtils.getRotation(currentEntity));
|
||||||
|
modelTransformMatrix.scale(EntityUtils.getScale(currentEntity));
|
||||||
|
currentActor.applyModelMatrix(modelTransformMatrix);
|
||||||
|
//draw
|
||||||
|
// if(!currentEntity.getDataKeys().contains(EntityDataStrings.TERRAIN_IS_TERRAIN) && !currentEntity.getDataKeys().contains(EntityDataStrings.DATA_STRING_CREATURE_IS_CREATURE)){
|
||||||
|
currentActor.drawForDepthBuffer();
|
||||||
|
// System.out.println(currentActor.modelPath);
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//stop rendering front faces
|
||||||
|
GL15.glEnable(GL15.GL_CULL_FACE);
|
||||||
|
GL15.glCullFace(GL15.GL_BACK);
|
||||||
|
|
||||||
|
Globals.renderingEngine.setActiveShader(volumeDepthShaderProgram);
|
||||||
|
|
||||||
|
volumeDepthFrontfaceFramebuffer.bind();
|
||||||
|
glClear(GL_DEPTH_BUFFER_BIT);
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
// glBindTexture(GL_TEXTURE_2D, woodTexture);
|
||||||
|
// renderScene(simpleDepthShader);
|
||||||
|
|
||||||
|
// glUniformMatrix4fv(glGetUniformLocation(Globals.renderingEngine.getActiveShader().shaderProgram, "view"), false, Globals.viewMatrix.get(new float[16]));
|
||||||
|
// glUniformMatrix4fv(glGetUniformLocation(Globals.renderingEngine.getActiveShader().shaderProgram, "projection"), false, Globals.projectionMatrix.get(new float[16]));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// GL20.glUniform1f(glGetUniformLocation(Globals.renderingEngine.getActiveShader().shaderProgram, "linearCoef"), volumeDepthLinearCoef);
|
||||||
|
// GL20.glUniform1f(glGetUniformLocation(Globals.renderingEngine.getActiveShader().shaderProgram, "quadCoef"), volumeDepthQuadCoef);
|
||||||
|
|
||||||
|
// glCullFace(GL_FRONT);
|
||||||
|
|
||||||
|
//
|
||||||
|
// D R A W A L L E N T I T I E S
|
||||||
|
//
|
||||||
|
for(Entity currentEntity : Globals.entityManager.getDrawable()){
|
||||||
|
Vector3d position = EntityUtils.getPosition(currentEntity);
|
||||||
|
if(
|
||||||
|
(boolean)currentEntity.getData(EntityDataStrings.DATA_STRING_DRAW) &&
|
||||||
|
drawPoint(cameraPos,new Vector3f((float)position.x,(float)position.y,(float)position.z)) &&
|
||||||
|
currentEntity.getDataKeys().contains(EntityDataStrings.DRAW_VOLUMETRIC)
|
||||||
|
){
|
||||||
|
//fetch actor
|
||||||
|
Actor currentActor = EntityUtils.getActor(currentEntity);
|
||||||
|
//calculate camera-modified vector3f
|
||||||
|
Vector3f cameraModifiedPosition = new Vector3f((float)position.x,(float)position.y,(float)position.z).sub(CameraEntityUtils.getCameraCenter(Globals.playerCamera));
|
||||||
|
//calculate and apply model transform
|
||||||
|
modelTransformMatrix = modelTransformMatrix.identity();
|
||||||
|
modelTransformMatrix.translate(cameraModifiedPosition);
|
||||||
|
modelTransformMatrix.rotate(EntityUtils.getRotation(currentEntity));
|
||||||
|
modelTransformMatrix.scale(EntityUtils.getScale(currentEntity));
|
||||||
|
currentActor.applyModelMatrix(modelTransformMatrix);
|
||||||
|
//draw
|
||||||
|
// if(!currentEntity.getDataKeys().contains(EntityDataStrings.TERRAIN_IS_TERRAIN) && !currentEntity.getDataKeys().contains(EntityDataStrings.DATA_STRING_CREATURE_IS_CREATURE)){
|
||||||
|
currentActor.drawForDepthBuffer();
|
||||||
|
// System.out.println(currentActor.modelPath);
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GL15.glCullFace(GL15.GL_BACK);
|
||||||
|
//now cull back faces
|
||||||
|
|
||||||
|
//reset texture
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
|
//bind default framebuffer
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER,0);
|
||||||
|
//resume culling backface
|
||||||
|
GL15.glDisable(GL15.GL_CULL_FACE);
|
||||||
|
}
|
||||||
|
|
||||||
static void renderBlackBackground(){
|
static void renderBlackBackground(){
|
||||||
//render full screen quad
|
//render full screen quad
|
||||||
@ -768,8 +952,23 @@ public class RenderingEngine {
|
|||||||
// System.out.println(tLeft.get() + " " + tTop.get() + " " + tRight.get() + " " + tBottom.get());
|
// System.out.println(tLeft.get() + " " + tTop.get() + " " + tRight.get() + " " + tBottom.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Texture getVolumeBackfaceTexture(){
|
||||||
|
return volumeDepthBackfaceTexture;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Texture getVolumeFrontfaceTexture(){
|
||||||
|
return volumeDepthFrontfaceTexture;
|
||||||
|
}
|
||||||
|
|
||||||
public LightManager getLightManager(){
|
public LightManager getLightManager(){
|
||||||
return lightManager;
|
return lightManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void incrementOutputFramebuffer(){
|
||||||
|
outputFramebuffer++;
|
||||||
|
if(outputFramebuffer > 3){
|
||||||
|
outputFramebuffer = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,8 +5,10 @@ import electrosphere.renderer.Bone;
|
|||||||
import electrosphere.renderer.Model;
|
import electrosphere.renderer.Model;
|
||||||
import electrosphere.renderer.texture.Texture;
|
import electrosphere.renderer.texture.Texture;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.PriorityQueue;
|
import java.util.PriorityQueue;
|
||||||
|
|
||||||
import org.joml.AxisAngle4f;
|
import org.joml.AxisAngle4f;
|
||||||
@ -26,6 +28,7 @@ public class Actor {
|
|||||||
PriorityQueue<ActorAnimationMask> animationQueue = new PriorityQueue<ActorAnimationMask>();
|
PriorityQueue<ActorAnimationMask> animationQueue = new PriorityQueue<ActorAnimationMask>();
|
||||||
ActorMeshMask meshMask = new ActorMeshMask();
|
ActorMeshMask meshMask = new ActorMeshMask();
|
||||||
List<ActorShaderMask> shaderMasks = new LinkedList<ActorShaderMask>();
|
List<ActorShaderMask> shaderMasks = new LinkedList<ActorShaderMask>();
|
||||||
|
Map<String,ActorTextureMask> textureMap = null;
|
||||||
|
|
||||||
public Actor(String modelPath){
|
public Actor(String modelPath){
|
||||||
this.modelPath = modelPath;
|
this.modelPath = modelPath;
|
||||||
@ -183,6 +186,7 @@ public class Actor {
|
|||||||
applyAnimationMasks(model);
|
applyAnimationMasks(model);
|
||||||
meshMask.processMeshMaskQueue();
|
meshMask.processMeshMaskQueue();
|
||||||
model.setMeshMask(meshMask);
|
model.setMeshMask(meshMask);
|
||||||
|
model.setTextureMask(textureMap);
|
||||||
// if(!meshMask.isEmpty()){
|
// if(!meshMask.isEmpty()){
|
||||||
// }
|
// }
|
||||||
// if(animation != null){
|
// if(animation != null){
|
||||||
@ -210,6 +214,7 @@ public class Actor {
|
|||||||
model.draw(true, true, false, true, true, true, true);
|
model.draw(true, true, false, true, true, true, true);
|
||||||
}
|
}
|
||||||
model.getShaderMask().clear();
|
model.getShaderMask().clear();
|
||||||
|
model.setTextureMask(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -328,5 +333,12 @@ public class Actor {
|
|||||||
throw new UnsupportedOperationException("Not implemented yet");
|
throw new UnsupportedOperationException("Not implemented yet");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addTextureMask(ActorTextureMask textureMask){
|
||||||
|
if(textureMap == null){
|
||||||
|
textureMap = new HashMap<String,ActorTextureMask>();
|
||||||
|
}
|
||||||
|
textureMap.put(textureMask.getMeshName(),textureMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,31 @@
|
|||||||
|
package electrosphere.renderer.actor;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import electrosphere.renderer.texture.Texture;
|
||||||
|
|
||||||
|
public class ActorTextureMask {
|
||||||
|
|
||||||
|
String meshName;
|
||||||
|
List<Texture> textures;
|
||||||
|
List<String> uniformNames;
|
||||||
|
|
||||||
|
public ActorTextureMask(String meshName, List<Texture> textures, List<String> uniformNames){
|
||||||
|
this.meshName = meshName;
|
||||||
|
this.textures = textures;
|
||||||
|
this.uniformNames = uniformNames;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMeshName(){
|
||||||
|
return meshName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Texture> getTextures(){
|
||||||
|
return textures;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getUniformNames(){
|
||||||
|
return uniformNames;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -2,6 +2,8 @@ package electrosphere.renderer.framebuffer;
|
|||||||
|
|
||||||
import electrosphere.logger.LoggerInterface;
|
import electrosphere.logger.LoggerInterface;
|
||||||
import electrosphere.main.Globals;
|
import electrosphere.main.Globals;
|
||||||
|
import electrosphere.renderer.texture.Texture;
|
||||||
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
@ -157,4 +159,48 @@ public class FramebufferUtils {
|
|||||||
}
|
}
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static Texture generateDepthBufferTexture(int width, int height){
|
||||||
|
int texturePtr = glGenTextures();
|
||||||
|
glBindTexture(GL_TEXTURE_2D,texturePtr);
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT , NULL);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
|
||||||
|
float borderColor[] = { 1.0f, 1.0f, 1.0f, 1.0f };
|
||||||
|
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
|
||||||
|
|
||||||
|
Texture texture = new Texture(texturePtr);
|
||||||
|
|
||||||
|
return texture;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Framebuffer generateDepthBuffer(int width, int height, Texture texture){
|
||||||
|
Framebuffer buffer = new Framebuffer();
|
||||||
|
buffer.bind();
|
||||||
|
|
||||||
|
|
||||||
|
//texture
|
||||||
|
buffer.setTexturePointer(texture.getTexturePointer());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//bind texture to fbo
|
||||||
|
int mipMapLevel = 0;
|
||||||
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, texture.getTexturePointer(), mipMapLevel);
|
||||||
|
glDrawBuffer(GL_NONE);
|
||||||
|
glReadBuffer(GL_NONE);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//check make sure compiled
|
||||||
|
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE){
|
||||||
|
System.out.println("Framebuffer is not complete!");
|
||||||
|
}
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,9 +30,16 @@ public class Texture {
|
|||||||
int height;
|
int height;
|
||||||
boolean hasTransparency;
|
boolean hasTransparency;
|
||||||
String path = "";
|
String path = "";
|
||||||
|
|
||||||
|
|
||||||
public Texture(){
|
public Texture(){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Texture(int pointer){
|
||||||
|
this.texturePointer = pointer;
|
||||||
|
}
|
||||||
|
|
||||||
public Texture(String path){
|
public Texture(String path){
|
||||||
this.path = path;
|
this.path = path;
|
||||||
//generate the texture object on gpu
|
//generate the texture object on gpu
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user