231 lines
6.8 KiB
Ada
231 lines
6.8 KiB
Ada
with
|
|
openGL.Camera,
|
|
openGL.Texture,
|
|
|
|
ada.unchecked_Deallocation;
|
|
|
|
package body openGL.Impostor.terrain
|
|
is
|
|
|
|
overriding
|
|
procedure set_Target (Self : in out Item; Target : in openGL.Visual.view)
|
|
is
|
|
begin
|
|
set_Target (openGL.impostor.item (Self), Target); -- Base class call.
|
|
|
|
Self.expand_X := 0.02;
|
|
Self.expand_Y := 0.02;
|
|
end set_Target;
|
|
|
|
|
|
|
|
procedure free (Self : in out View)
|
|
is
|
|
procedure deallocate is new ada.unchecked_Deallocation (Item'Class, View);
|
|
begin
|
|
destroy (Self.all);
|
|
deallocate (Self);
|
|
end free;
|
|
|
|
|
|
|
|
overriding
|
|
function current_Camera_look_at_Rotation (Self : in Item) return Matrix_3x3
|
|
is
|
|
begin
|
|
return Self.current_Camera_look_at_Rotation;
|
|
end current_Camera_look_at_Rotation;
|
|
|
|
|
|
|
|
overriding
|
|
function update_Required (Self : access Item; the_Camera : access Camera.item'Class) return Boolean
|
|
is
|
|
begin
|
|
Self.current_pixel_Region := Self.get_pixel_Region (camera_Spin => the_Camera.Spin,
|
|
camera_Site => the_Camera.Site,
|
|
camera_projection_Transform => the_Camera.projection_Transform,
|
|
camera_Viewport => the_Camera.Viewport);
|
|
declare
|
|
use GL;
|
|
use type GL.glInt;
|
|
|
|
update_Required : Boolean := Self.general_Update_required (the_Camera.Site, Self.current_pixel_Region);
|
|
|
|
copy_x_Offset : gl.glInt := 0;
|
|
copy_y_Offset : gl.glInt := 0;
|
|
copy_X : gl.glInt := Self.current_pixel_Region.X;
|
|
copy_Y : gl.glInt := Self.current_pixel_Region.Y;
|
|
copy_Width : gl.glSizeI := Self.current_pixel_Region.Width;
|
|
copy_Height : gl.glSizeI := Self.current_pixel_Region.Height;
|
|
|
|
viewport_Width : constant Integer := the_Camera.Viewport.Max (1) - the_Camera.Viewport.Min (1) + 1;
|
|
viewport_Height : constant Integer := the_Camera.Viewport.Max (2) - the_Camera.Viewport.Min (2) + 1;
|
|
|
|
Complete_left : Boolean;
|
|
Complete_right : Boolean;
|
|
Complete_top : Boolean;
|
|
Complete_bottom : Boolean;
|
|
now_Complete : Boolean;
|
|
|
|
begin
|
|
if copy_X < 0
|
|
then
|
|
copy_x_Offset := -copy_X;
|
|
copy_X := 0;
|
|
copy_Width := copy_Width - glSizeI (copy_x_Offset);
|
|
|
|
Complete_left := False;
|
|
Complete_right := True;
|
|
|
|
if copy_Width < 1
|
|
then
|
|
Self.is_Valid := False;
|
|
return False; -- NB: Short circuit return !
|
|
end if;
|
|
|
|
elsif copy_X + glInt (copy_Width) > glInt (Viewport_Width)
|
|
then
|
|
copy_Width := glSizeI (viewport_Width) - glSizeI (copy_X);
|
|
|
|
Complete_left := True;
|
|
Complete_right := False;
|
|
|
|
if copy_Width < 1
|
|
then
|
|
Self.is_Valid := False;
|
|
return False; -- NB: Short circuit return !
|
|
end if;
|
|
|
|
else
|
|
Complete_left := True;
|
|
Complete_right := True;
|
|
end if;
|
|
|
|
|
|
if copy_Y < 0
|
|
then
|
|
copy_y_Offset := -copy_Y;
|
|
copy_Y := 0;
|
|
copy_Height := copy_Height - glSizeI (copy_y_Offset);
|
|
|
|
Complete_top := True;
|
|
Complete_bottom := False;
|
|
|
|
if copy_Height < 1
|
|
then
|
|
Self.is_Valid := False;
|
|
return False; -- NB: Short circuit return !
|
|
end if;
|
|
|
|
elsif copy_Y + glInt (copy_Height) > glInt (Viewport_Height)
|
|
then
|
|
copy_Height := glSizeI (viewport_Height) - glSizeI (copy_Y);
|
|
|
|
Complete_top := False;
|
|
Complete_bottom := True;
|
|
|
|
if copy_Height < 1
|
|
then
|
|
Self.is_Valid := False;
|
|
return False; -- NB: Short circuit return !
|
|
end if;
|
|
|
|
else
|
|
Complete_top := True;
|
|
Complete_bottom := True;
|
|
end if;
|
|
|
|
now_Complete := Complete_left
|
|
and Complete_right
|
|
and Complete_top
|
|
and Complete_bottom;
|
|
|
|
if not update_Required
|
|
then -- Only do further tests if update not already required.
|
|
if Self.prior_Complete
|
|
then
|
|
if now_Complete
|
|
and then Self.size_Update_required (Self.current_pixel_Region)
|
|
then
|
|
update_Required := True;
|
|
end if;
|
|
|
|
else
|
|
if copy_Width > Self.prior_copy_Width
|
|
then
|
|
update_Required := True;
|
|
end if;
|
|
|
|
if copy_Height > Self.prior_copy_Height
|
|
then
|
|
update_Required := True;
|
|
end if;
|
|
end if;
|
|
end if;
|
|
|
|
|
|
if update_Required
|
|
then
|
|
Self.current_Width_pixels := Self.current_pixel_Region.Width; -- Cache current state.
|
|
Self.current_Height_pixels := Self.current_pixel_Region.Height;
|
|
|
|
Self.current_copy_X_Offset := copy_X_Offset;
|
|
Self.current_copy_Y_Offset := copy_Y_Offset;
|
|
|
|
Self.current_copy_X := copy_X;
|
|
Self.current_copy_Y := copy_Y;
|
|
|
|
Self.current_copy_Width := copy_Width;
|
|
Self.current_copy_Height := copy_Height;
|
|
|
|
Self.current_Complete := now_Complete;
|
|
|
|
Self.prior_copy_Width := Self.current_copy_Width; -- Set prior state.
|
|
Self.prior_copy_Height := Self.current_copy_Height;
|
|
Self.prior_Complete := Self.current_Complete;
|
|
end if;
|
|
|
|
Self.is_Valid := True;
|
|
Self.current_Camera_look_at_Rotation := the_Camera.Spin;
|
|
|
|
return update_Required;
|
|
end;
|
|
end update_Required;
|
|
|
|
|
|
|
|
overriding
|
|
procedure pre_update (Self : in out Item; the_Camera : access Camera.item'Class)
|
|
is
|
|
pragma unreferenced (the_Camera);
|
|
begin
|
|
Self.expand_X := 0.0;
|
|
Self.expand_Y := 0.0;
|
|
end pre_update;
|
|
|
|
|
|
|
|
overriding
|
|
procedure update (Self : in out Item; the_Camera : access Camera.item'Class;
|
|
texture_Pool : in Texture.Pool_view)
|
|
is
|
|
begin
|
|
Self.expand_X := 0.0;
|
|
Self.expand_Y := 0.0;
|
|
|
|
Impostor.item (Self).update (the_Camera, texture_Pool); -- Base class 'update'.
|
|
end update;
|
|
|
|
|
|
|
|
overriding
|
|
procedure post_update (Self : in out Item; the_Camera : access Camera.item'Class)
|
|
is
|
|
begin
|
|
null;
|
|
end post_update;
|
|
|
|
|
|
end openGL.Impostor.terrain;
|