DEADSOFTWARE

grid
[d2df-sdl.git] / src / game / g_panel.pas
index 9672be8f5834b37e169c9410123a4cf9bb6ac510..d724f2af056e6e91ea8154bb4b14c6678aaf78d6 100644 (file)
@@ -1,3 +1,19 @@
+(* Copyright (C)  DooM 2D:Forever Developers
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *)
+{$MODE DELPHI}
 unit g_panel;
 
 interface
@@ -35,8 +51,10 @@ type
     SaveIt:           Boolean; // Ñîõðàíÿòü ïðè SaveState?
     Enabled:          Boolean;
     Door:             Boolean;
+    Moved:            Boolean;
     LiftType:         Byte;
     LastAnimLoop:     Byte;
+    ArrIdx:           Integer; // index in one of internal arrays; sorry
 
     constructor Create(PanelRec: TPanelRec_1;
                        AddTextures: TAddTextureArray;
@@ -45,6 +63,7 @@ type
     destructor  Destroy(); override;
 
     procedure   Draw();
+    procedure   DrawShadowVolume(lightX: Integer; lightY: Integer; radius: Integer);
     procedure   Update();
     procedure   SetFrame(Frame: Integer; Count: Byte);
     procedure   NextTexture(AnimLoop: Byte = 0);
@@ -56,13 +75,14 @@ type
     procedure   LoadState(var Mem: TBinMemoryReader);
   end;
 
+  PPanel = ^TPanel;
   TPanelArray = Array of TPanel;
 
 implementation
 
 uses
   SysUtils, g_basic, g_map, MAPDEF, g_game, e_graphics,
-  g_console, g_language, e_log;
+  g_console, g_language, e_log, GL;
 
 const
   PANEL_SIGNATURE = $4C4E4150; // 'PANL'
@@ -85,6 +105,7 @@ begin
   FCurFrame := 0;
   FCurFrameCount := 0;
   LastAnimLoop := 0;
+  Moved := False;
 
 // Òèï ïàíåëè:
   PanelType := PanelRec.PanelType;
@@ -200,6 +221,10 @@ begin
   if PanelRec.TextureNum > High(Textures) then
   begin
     e_WriteLog(Format('WTF?! PanelRec.TextureNum is out of limits! (%d : %d)', [PanelRec.TextureNum, High(Textures)]), MSG_FATALERROR);
+    FTextureWidth := 2;
+    FTextureHeight := 2;
+    FAlpha := 0;
+    FBlending := ByteBool(0);
   end
   else if not g_Map_IsSpecialTexture(Textures[PanelRec.TextureNum].TextureName) then
   begin
@@ -286,6 +311,53 @@ begin
   end;
 end;
 
+procedure TPanel.DrawShadowVolume(lightX: Integer; lightY: Integer; radius: Integer);
+  procedure extrude (x: Integer; y: Integer);
+  begin
+    glVertex2i(x+(x-lightX)*500, y+(y-lightY)*500);
+    //e_WriteLog(Format('  : (%d,%d)', [x+(x-lightX)*300, y+(y-lightY)*300]), MSG_WARNING);
+  end;
+
+  procedure drawLine (x0: Integer; y0: Integer; x1: Integer; y1: Integer);
+  begin
+    // does this side facing the light?
+    if ((x1-x0)*(lightY-y0)-(lightX-x0)*(y1-y0) >= 0) then exit;
+    //e_WriteLog(Format('lightpan: (%d,%d)-(%d,%d)', [x0, y0, x1, y1]), MSG_WARNING);
+    // this edge is facing the light, extrude and draw it
+    glVertex2i(x0, y0);
+    glVertex2i(x1, y1);
+    extrude(x1, y1);
+    extrude(x0, y0);
+  end;
+
+begin
+  if radius < 4 then exit;
+  if Enabled and (FCurTexture >= 0) and (Width > 0) and (Height > 0) and (FAlpha < 255) and g_Collide(X, Y, Width, Height, sX, sY, sWidth, sHeight) then
+  begin
+    if not FTextureIDs[FCurTexture].Anim then
+    begin
+      case FTextureIDs[FCurTexture].Tex of
+        TEXTURE_SPECIAL_WATER: exit;
+        TEXTURE_SPECIAL_ACID1: exit;
+        TEXTURE_SPECIAL_ACID2: exit;
+        TEXTURE_NONE: exit;
+      end;
+    end;
+    if (X+Width < lightX-radius) then exit;
+    if (Y+Height < lightY-radius) then exit;
+    if (X > lightX+radius) then exit;
+    if (Y > lightY+radius) then exit;
+    //e_DrawFill(FTextureIDs[FCurTexture].Tex, X, Y, Width div FTextureWidth, Height div FTextureHeight, FAlpha, True, FBlending);
+
+    glBegin(GL_QUADS);
+      drawLine(x,       y,        x+width, y); // top
+      drawLine(x+width, y,        x+width, y+height); // right
+      drawLine(x+width, y+height, x,       y+height); // bottom
+      drawLine(x,       y+height, x,       y); // left
+    glEnd();
+  end;
+end;
+
 procedure TPanel.Update();
 begin
   if Enabled and (FCurTexture >= 0) and
@@ -447,6 +519,9 @@ begin
   Mem.WriteByte(LiftType);
 // Íîìåð òåêóùåé òåêñòóðû:
   Mem.WriteInt(FCurTexture);
+// Êîîðäû
+  Mem.WriteInt(X);
+  Mem.WriteInt(Y);
 // Àíèìèðîâàííàÿ ëè òåêóùàÿ òåêñòóðà:
   if (FCurTexture >= 0) and (FTextureIDs[FCurTexture].Anim) then
     begin
@@ -482,6 +557,9 @@ begin
   Mem.ReadByte(LiftType);
 // Íîìåð òåêóùåé òåêñòóðû:
   Mem.ReadInt(FCurTexture);
+// Êîîðäû
+  Mem.ReadInt(X);
+  Mem.ReadInt(Y);
 // Àíèìèðîâàííàÿ ëè òåêóùàÿ òåêñòóðà:
   Mem.ReadBoolean(anim);
 // Åñëè äà - çàãðóæàåì àíèìàöèþ: