diff --git a/lib/game_objects/light.rb b/lib/game_objects/light.rb index 14ea9e9..cbc924d 100644 --- a/lib/game_objects/light.rb +++ b/lib/game_objects/light.rb @@ -1,35 +1,19 @@ class IMICFPS class Light - attr_reader :ambient, :diffuse, :specular, :position, :light_id - attr_accessor :x, :y, :z, :intensity - def initialize(id:, x:,y:,z:, + attr_reader :light_id + attr_accessor :ambient, :diffuse, :specular, :position, :intensity + def initialize(id:, ambient: Vector.new(0.5, 0.5, 0.5, 1), diffuse: Vector.new(1, 0.5, 0, 1), specular: Vector.new(0.2, 0.2, 0.2, 1), - position: Vector.new(x, y, z, 0), intensity: 1) + position: Vector.new(0, 0, 0, 0), intensity: 1 + ) @light_id = id - @x,@y,@z = x,y,z @intensity = intensity - self.ambient = ambient - self.diffuse = diffuse - self.specular = specular - self.position = position - end - - def ambient=(color) - @ambient = convert(color).pack("f*") - end - - def diffuse=(color) - @diffuse = convert(color, true).pack("f*") - end - - def specular=(color) - @specular = convert(color, true).pack("f*") - end - - def position=(vertex) - @position = convert(vertex).pack("f*") + @ambient = ambient + @diffuse = diffuse + @specular = specular + @position = position end def draw diff --git a/lib/map.rb b/lib/map.rb index dadd8bb..fc8ea8f 100644 --- a/lib/map.rb +++ b/lib/map.rb @@ -29,8 +29,8 @@ class IMICFPS add_entity(Player.new(spawnpoint: @map_loader.spawnpoints.sample, manifest: Manifest.new(package: "base", name: "character"))) # TODO: Load lights from MapLoader - add_light(Light.new(id: available_light, x: 3, y: -6, z: 6)) - add_light(Light.new(id: available_light, x: 0, y: 100, z: 0, diffuse: Color.new(1.0, 0.5, 0.1))) + add_light(Light.new(id: available_light, position: Vector.new(30, 10.0, 30))) + # add_light(Light.new(id: available_light, x: 0, y: 100, z: 0, diffuse: Color.new(1.0, 0.5, 0.1))) end def data diff --git a/lib/renderer/opengl_renderer.rb b/lib/renderer/opengl_renderer.rb index b6c09c7..c410901 100644 --- a/lib/renderer/opengl_renderer.rb +++ b/lib/renderer/opengl_renderer.rb @@ -15,6 +15,7 @@ class IMICFPS shader.set_uniform("hasTexture", object.model.has_texture?) # TODO: Upload and use lights + shader.set_uniform("lightPos", lights.first.position) handleGlError draw_model(object.model) diff --git a/shaders/fragment/default.glsl b/shaders/fragment/default.glsl index da61643..c1d28b3 100644 --- a/shaders/fragment/default.glsl +++ b/shaders/fragment/default.glsl @@ -5,6 +5,8 @@ in vec3 outColor; in vec4 outNormal; in vec3 outUV; in float outTextureID; +in vec3 outLightPos; +in vec3 outFragPos; // optimizing compilers are annoying at this stage of my understanding of GLSL vec4 lokiVar; @@ -12,5 +14,13 @@ vec4 lokiVar; void main() { lokiVar = vec4(outColor, 1.0) + outNormal + vec4(outUV, 1.0) + vec4(outTextureID, 1.0, 1.0, 1.0); lokiVar = normalize(lokiVar); - gl_FragColor = vec4(outColor, 1.0); + + vec3 lightDir = normalize(outLightPos - outFragPos); + vec3 ambient = vec3(0.5, 0.5, 0.35); + float diffuse = max(dot(vec3(outNormal), lightDir), -0.2); + vec3 specular = vec3(0, 0, 0); + + vec3 result =(ambient + diffuse + specular) * outColor; + + gl_FragColor = vec4(result, 1.0); } \ No newline at end of file diff --git a/shaders/vertex/default.glsl b/shaders/vertex/default.glsl index c7b73b1..335d055 100644 --- a/shaders/vertex/default.glsl +++ b/shaders/vertex/default.glsl @@ -12,11 +12,15 @@ out vec4 outNormal; out vec3 outUV; out float outTextureID; out float outHasTexture; +out vec3 outLightPos; +out vec3 outFragPos; uniform mat4 projection; uniform mat4 view; uniform mat4 model; uniform int hasTexture; +uniform vec3 lightPos; + void main() { // projection * view * model * position @@ -26,6 +30,9 @@ void main() { outUV = inUV; outTextureID = inTextureID; outHasTexture = hasTexture; + outLightPos = lightPos; + + outFragPos = vec3(model * vec4(inPosition, 1.0)); gl_Position = projection * view * model * vec4(inPosition, 1.0); } \ No newline at end of file