From 0b655ea2bec987d70611f41c8ce8a967eeef1f8c Mon Sep 17 00:00:00 2001 From: Rod Kay Date: Wed, 28 Feb 2024 21:11:59 +1100 Subject: [PATCH] opengl.light: Add 'Strength' to lights. --- .../assets/shader/lighting-frag.snippet | 3 ++- .../opengl/source/lean/light/opengl-light.adb | 16 ++++++++++++ .../opengl/source/lean/light/opengl-light.ads | 25 +++++++++++-------- .../source/lean/shader/opengl-program-lit.adb | 16 +++++------- 4 files changed, 39 insertions(+), 21 deletions(-) diff --git a/3-mid/opengl/assets/shader/lighting-frag.snippet b/3-mid/opengl/assets/shader/lighting-frag.snippet index ac65146..f634c20 100644 --- a/3-mid/opengl/assets/shader/lighting-frag.snippet +++ b/3-mid/opengl/assets/shader/lighting-frag.snippet @@ -4,6 +4,7 @@ struct light { vec4 Site; + float Strength; vec3 Color; float Attenuation; float ambient_Coefficient; @@ -67,7 +68,7 @@ apply_Light (light Light, // Abmbient. // - vec3 lit_surface_Color = surface_Color * Light.Color; + vec3 lit_surface_Color = surface_Color * Light.Color * Light.Strength; vec3 Ambient = Light.ambient_Coefficient * lit_surface_Color; diff --git a/3-mid/opengl/source/lean/light/opengl-light.adb b/3-mid/opengl/source/lean/light/opengl-light.adb index a85db84..94550eb 100644 --- a/3-mid/opengl/source/lean/light/opengl-light.adb +++ b/3-mid/opengl/source/lean/light/opengl-light.adb @@ -58,6 +58,22 @@ is end Site_is; + + function Strength (Self : in Item) return Intensity + is + begin + return Self.Strength; + end Strength; + + + procedure Strength_is (Self : in out Item; Now : in Intensity) + is + begin + Self.Strength := Now; + end Strength_is; + + + function Color (Self : in Item) return openGL.Color is begin diff --git a/3-mid/opengl/source/lean/light/opengl-light.ads b/3-mid/opengl/source/lean/light/opengl-light.ads index 942e7f5..eed9d1b 100644 --- a/3-mid/opengl/source/lean/light/opengl-light.ads +++ b/3-mid/opengl/source/lean/light/opengl-light.ads @@ -14,22 +14,26 @@ is -------------- --- Attributes -- - type Id_t is new Natural; - type Kind_t is (Diffuse, Direct); + type Id_t is new Natural; + type Kind_t is (Diffuse, Direct); + type Intensity is digits 5 range 0.0 .. 10.0; null_Id : constant Id_t; - function Id (Self : in Item) return light.Id_t; - procedure Id_is (Self : in out Item; Now : in light.Id_t); + function Id (Self : in Item) return light.Id_t; + procedure Id_is (Self : in out Item; Now : in light.Id_t); - function Kind (Self : in Item) return light.Kind_t; - procedure Kind_is (Self : in out Item; Now : in light.Kind_t); + function Kind (Self : in Item) return light.Kind_t; + procedure Kind_is (Self : in out Item; Now : in light.Kind_t); - function is_On (Self : in Item) return Boolean; - procedure is_On (Self : in out Item; Now : in Boolean := True); + function is_On (Self : in Item) return Boolean; + procedure is_On (Self : in out Item; Now : in Boolean := True); - function Site (Self : in Item) return openGL.Site; - procedure Site_is (Self : in out Item; Now : in openGL.Site); + function Site (Self : in Item) return openGL.Site; + procedure Site_is (Self : in out Item; Now : in openGL.Site); + + function Strength (Self : in Item) return Intensity; + procedure Strength_is (Self : in out Item; Now : in Intensity); function Color (Self : in Item) return Color; function Attenuation (Self : in Item) return Real; @@ -56,6 +60,7 @@ private On : Boolean := True; Site : openGL.Site := [0.0, 0.0, 1.0]; -- The GL default. + Strength : Intensity := 1.0; Color : openGL.Color := Palette.White; Attenuation : Real := 0.1; ambient_Coefficient : Real := 0.1; diff --git a/3-mid/opengl/source/lean/shader/opengl-program-lit.adb b/3-mid/opengl/source/lean/shader/opengl-program-lit.adb index 6a1a74d..f17ee0f 100644 --- a/3-mid/opengl/source/lean/shader/opengl-program-lit.adb +++ b/3-mid/opengl/source/lean/shader/opengl-program-lit.adb @@ -1,12 +1,6 @@ with openGL.Conversions, - GL.lean, - GL.Binding, - GL.Pointers, - ada.Strings.fixed, - Interfaces.C.Strings; - -with ada.text_io; use ada.text_io; + ada.Strings.fixed; package body openGL.Program.lit @@ -49,9 +43,9 @@ is the_model_transform_Uniform : constant Variable.uniform.mat4 := Self.uniform_Variable ("model_Transform"); the_inverse_model_rotation_Uniform : constant Variable.uniform.mat3 := Self.uniform_Variable ("inverse_model_Rotation"); - the_camera_site_Uniform : constant Variable.uniform.vec3 := Self.uniform_Variable ("camera_Site"); - the_light_count_Uniform : constant Variable.uniform.int := Self.uniform_Variable ("light_Count"); - the_specular_color_Uniform : constant Variable.uniform.vec3 := Self.uniform_Variable ("specular_Color"); + the_camera_site_Uniform : constant Variable.uniform.vec3 := Self.uniform_Variable ("camera_Site"); + the_light_count_Uniform : constant Variable.uniform.int := Self.uniform_Variable ("light_Count"); + the_specular_color_Uniform : constant Variable.uniform.vec3 := Self.uniform_Variable ("specular_Color"); begin openGL.Program.item (Self).set_Uniforms; @@ -80,6 +74,7 @@ is end light_Name; site_Uniform : constant Variable.uniform.vec4 := Self.uniform_Variable (light_Name & ".Site"); + strength_Uniform : constant Variable.uniform.float := Self.uniform_Variable (light_Name & ".Strength"); color_Uniform : constant Variable.uniform.vec3 := Self.uniform_Variable (light_Name & ".Color"); attenuation_Uniform : constant Variable.uniform.float := Self.uniform_Variable (light_Name & ".Attenuation"); ambient_coefficient_Uniform : constant Variable.uniform.float := Self.uniform_Variable (light_Name & ".ambient_Coefficient"); @@ -93,6 +88,7 @@ is end case; color_Uniform .Value_is (to_Vector_3 (Light.Color)); + strength_Uniform .Value_is (Real (Light.Strength)); attenuation_Uniform .Value_is ( Light.Attenuation); ambient_coefficient_Uniform.Value_is ( Light.ambient_Coefficient); cone_angle_Uniform .Value_is (Real (Light.cone_Angle));