mirror of
https://github.com/Reuh/wirefame.git
synced 2025-10-27 09:39:30 +00:00
Rewrite
This commit is contained in:
parent
b4798c8c16
commit
77cfbaad52
24 changed files with 3033 additions and 1545 deletions
21
shader/pick.lua
Normal file
21
shader/pick.lua
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
return [[
|
||||
|
||||
# ifdef VERTEX
|
||||
uniform mat4 scene_transform; // world -> view transform
|
||||
uniform mat4 model_transform; // model -> world transform
|
||||
|
||||
vec4 position(mat4 love_transform, vec4 vertex_position) {
|
||||
return scene_transform * model_transform * vertex_position;
|
||||
}
|
||||
# endif
|
||||
|
||||
# ifdef PIXEL
|
||||
uniform vec3 pick_color;
|
||||
|
||||
vec4 effect(vec4 color, sampler2D texture, vec2 texture_coords, vec2 screen_coords) {
|
||||
if (texture2D(texture, texture_coords).a < 0.1) discard;
|
||||
return vec4(pick_color, 1);
|
||||
}
|
||||
# endif
|
||||
|
||||
]]
|
||||
74
shader/render.lua
Normal file
74
shader/render.lua
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
return [[
|
||||
|
||||
varying vec3 normal_world; // vertex normal in world space
|
||||
varying vec4 position_world; // fragment position in world space
|
||||
|
||||
# ifdef VERTEX
|
||||
uniform mat4 scene_transform; // world -> view transform
|
||||
uniform mat4 model_transform; // model -> world transform
|
||||
|
||||
attribute vec3 VertexNormal;
|
||||
|
||||
vec4 position(mat4 love_transform, vec4 vertex_position) {
|
||||
normal_world = (model_transform * vec4(VertexNormal, 0)).xyz;
|
||||
position_world = model_transform * vertex_position;
|
||||
return scene_transform * position_world;
|
||||
}
|
||||
# endif
|
||||
|
||||
# ifdef PIXEL
|
||||
# if LIGHT_COUNT > 0
|
||||
struct Light {
|
||||
int type; // 1 for ambient, 2 for directional, 3 for point
|
||||
vec3 position; // position for point lights, or direction for directional lights
|
||||
vec4 color; // diffuse color for point and directional lights, or ambient color for ambient light (alpha is intensity)
|
||||
};
|
||||
|
||||
uniform Light[LIGHT_COUNT] lights;
|
||||
# endif
|
||||
|
||||
uniform vec4 baseColorFactor;
|
||||
|
||||
vec4 effect(vec4 color, sampler2D texture, vec2 texture_coords, vec2 screen_coords) {
|
||||
// base color
|
||||
vec4 material_color = texture2D(texture, texture_coords) * baseColorFactor * color;
|
||||
if (material_color.a < 0.1) discard;
|
||||
|
||||
# if LIGHT_COUNT > 0
|
||||
// shading
|
||||
vec4 final_color = vec4(0.0, 0.0, 0.0, material_color.a);
|
||||
for (int i = 0; i < LIGHT_COUNT; i++) {
|
||||
Light light = lights[i];
|
||||
|
||||
// ambient
|
||||
if (light.type == 1) {
|
||||
final_color.rgb += material_color.rgb * light.color.rgb * light.color.a;
|
||||
|
||||
// directional
|
||||
} else if (light.type == 2) {
|
||||
// diffuse lighting
|
||||
vec3 n = normalize(normal_world);
|
||||
vec3 l = normalize(-light.position);
|
||||
final_color.rgb += material_color.rgb * light.color.rgb * light.color.a * max(dot(n, l), 0.0);
|
||||
|
||||
// point
|
||||
} else if (light.type == 3) {
|
||||
// diffuse lighting
|
||||
vec3 n = normalize(normal_world);
|
||||
vec3 l = normalize(light.position - position_world.xyz);
|
||||
float distance = length(light.position - position_world.xyz);
|
||||
final_color.rgb += material_color.rgb * light.color.rgb * light.color.a * max(dot(n, l), 0.0) / (distance * distance);
|
||||
}
|
||||
|
||||
// no specular because i'm lazy (TODO)
|
||||
}
|
||||
|
||||
// done
|
||||
return final_color;
|
||||
# else
|
||||
return material_color;
|
||||
# endif
|
||||
}
|
||||
# endif
|
||||
|
||||
]]
|
||||
Loading…
Add table
Add a link
Reference in a new issue