DEADSOFTWARE

add stub opengl wrapper and remove nanogl wrapper.
[d2df-sdl.git] / src / game / g_gfx.pas
index 64b62e8d7682fdbc14f270b7dd01dc4c2645f3a6..8094c4e4e1af00e578f2f6d82d70340e75c565f0 100644 (file)
@@ -2,8 +2,7 @@
  *
  * 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.
+ * the Free Software Foundation, version 3 of the License ONLY.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -457,7 +456,7 @@ var
   ex: Integer;
 begin
   if (not force) and (ceilingY <> Unknown) then exit;
-  if (nil = g_Map_traceToNearest(x, y, x, g_Map_MinY, GridTagObstacle, @ex, @ceilingY)) then
+  if (nil = g_Map_traceToNearest(x, y, x, g_Map_MinY, GridTagSolid, @ex, @ceilingY)) then
   begin
     ceilingY := g_Map_MinY-2;
   end;
@@ -599,7 +598,7 @@ var
   pan: TPanel;
   dx, dy: SmallInt;
   ex, ey: Integer;
-  checkEnv, inAir: Boolean;
+  checkEnv, inAir, inStep: Boolean;
   floorJustTraced: Boolean;
   {$IF DEFINED(D2F_DEBUG_FALL_MPLAT)}
   oldFloorY: Integer;
@@ -743,7 +742,24 @@ begin
     if (dx <> 0) then
     begin
       // has some horizontal velocity
-      pan := g_Map_traceToNearest(x, y, x+dx, y+dy, GridTagObstacle, @ex, @ey);
+      inStep := False;
+      pan := g_Map_traceToNearest(x, y, x+dx, y+dy, GridTagSolid, @ex, @ey);
+      if (pan = nil) and (dy >= 0) then
+      begin
+        // do not stuck inside step
+        if g_Map_traceToNearest(x, y, x, y, GridTagStep, nil, nil) = nil then
+          // check for step panel below
+          pan := g_Map_traceToNearest(x, y, x, y+dy, GridTagStep, nil, @ey);
+        inStep := pan <> nil;
+        if inStep then
+        begin
+          // stick to panel edges
+          if ex < pan.X then
+            ex := pan.X
+          else if ex > pan.X + pan.Width - 1 then
+            ex := pan.X + pan.Width - 1;
+        end;
+      end;
       checkEnv := (x <> ex);
       x := ex;
       y := ey;
@@ -757,19 +773,24 @@ begin
       end;
       if (pan <> nil) then
       begin
-        // we stuck
-        // the only case when we can have both ceiling and wall is corner; stick to wall in this case
-        // check if we stuck to a wall
-        if (dx < 0) then dx := -1 else dx := 1;
-        if (g_Map_PanelAtPoint(x+dx, y, GridTagObstacle) <> nil) then
-        begin
-          // stuck to a wall
-          stickToWall(dx);
-        end
+        if inStep then
+          stickToWall(dx)
         else
         begin
-          // stuck to a ceiling
-          stickToCeiling();
+          // we stuck
+          // the only case when we can have both ceiling and wall is corner; stick to wall in this case
+          // check if we stuck to a wall
+          if (dx < 0) then dx := -1 else dx := 1;
+          if (g_Map_PanelAtPoint(x+dx, y, GridTagSolid) <> nil) then
+          begin
+            // stuck to a wall
+            stickToWall(dx);
+          end
+          else
+          begin
+            // stuck to a ceiling
+            stickToCeiling();
+          end;
         end;
       end;
     end
@@ -963,11 +984,11 @@ begin
       if (x < g_Map_MinX) or (y < g_Map_MinY) or (x > g_Map_MaxX) or (y > g_Map_MaxY) then continue;
 
       // in what environment we are starting in?
-      pan := g_Map_PanelAtPoint(x, y, (GridTagObstacle or GridTagLiquid));
+      pan := g_Map_PanelAtPoint(x, y, (GridTagSolid or GridTagLiquid));
       if (pan <> nil) then
       begin
         // either in a wall, or in a liquid
-        if ((pan.tag and GridTagObstacle) <> 0) then continue; // don't spawn in walls
+        if ((pan.tag and GridTagSolid) <> 0) then continue; // don't spawn in walls
         env := TEnvType.ELiquid;
       end
       else
@@ -1276,7 +1297,7 @@ begin
   if (dx <> 0) then
   begin
     // has some horizontal velocity
-    pan := g_Map_traceToNearest(x, y, x+dx, y+dy, (GridTagObstacle or GridTagLiquid), @ex, @ey);
+    pan := g_Map_traceToNearest(x, y, x+dx, y+dy, (GridTagSolid or GridTagLiquid), @ex, @ey);
     if (x <> ex) then begin floorY := Unknown; ceilingY := Unknown; end; // dunno yet
     x := ex;
     y := ey;
@@ -1372,11 +1393,11 @@ begin
       if (x < g_Map_MinX) or (y < g_Map_MinY) or (x > g_Map_MaxX) or (y > g_Map_MaxY) then continue;
 
       // in what environment we are starting in?
-      pan := g_Map_PanelAtPoint(x, y, (GridTagObstacle or GridTagLiquid));
+      pan := g_Map_PanelAtPoint(x, y, (GridTagSolid or GridTagLiquid));
       if (pan <> nil) then
       begin
         // either in a wall, or in a liquid
-        //if ((pan.tag and GridTagObstacle) <> 0) then continue; // don't spawn in walls
+        //if ((pan.tag and GridTagSolid) <> 0) then continue; // don't spawn in walls
         //env := TEnvType.ELiquid;
         continue;
       end
@@ -1454,11 +1475,11 @@ begin
       if (x < g_Map_MinX) or (y < g_Map_MinY) or (x > g_Map_MaxX) or (y > g_Map_MaxY) then continue;
 
       // in what environment we are starting in?
-      pan := g_Map_PanelAtPoint(x, y, (GridTagObstacle or GridTagLiquid));
+      pan := g_Map_PanelAtPoint(x, y, (GridTagSolid or GridTagLiquid));
       if (pan <> nil) then
       begin
         // either in a wall, or in a liquid
-        //if ((pan.tag and GridTagObstacle) <> 0) then continue; // don't spawn in walls
+        //if ((pan.tag and GridTagSolid) <> 0) then continue; // don't spawn in walls
         //env := TEnvType.ELiquid;
         continue;
       end
@@ -1653,16 +1674,6 @@ end;
 procedure g_GFX_Draw ();
   var
     a, len: Integer;
-{$IFDEF USE_NANOGL}
-  type
-    Vertex = record
-      x, y: GLfloat;
-      r, g, b, a: GLfloat;
-    end;
-  var
-    count: Integer;
-    v: array of Vertex;
-{$ENDIF}
 begin
   if not gpart_dbg_enabled then exit;
 
@@ -1677,34 +1688,6 @@ begin
     glEnable(GL_BLEND);
     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
-{$IFDEF USE_NANOGL}
-    count := 0;
-    SetLength(v, Length(Particles));
-    for a := 0 to High(Particles) do
-    begin
-      with Particles[a] do
-      begin
-        if alive and (x >= sX) and (y >= sY) and (x <= sX + sWidth) and (sY <= sY + sHeight) then
-        begin
-          v[count].x := x + 0.37;
-          v[count].y := y + 0.37;
-          v[count].r := red / 255;
-          v[count].g := green / 255;
-          v[count].b := blue / 255;
-          v[count].a := alpha / 255;
-          Inc(count);
-        end;
-      end;
-    end;
-
-    glVertexPointer(2, GL_FLOAT, SizeOf(Vertex), @v[0].x);
-    glColorPointer(4, GL_FLOAT, SizeOf(Vertex), @v[0].r);
-    glEnableClientState(GL_VERTEX_ARRAY);
-    glEnableClientState(GL_COLOR_ARRAY);
-    glDisableClientState(GL_NORMAL_ARRAY);
-    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-    glDrawArrays(GL_POINTS, 0, count);
-{$ELSE}
     glBegin(GL_POINTS);
 
     len := High(Particles);
@@ -1722,7 +1705,6 @@ begin
     end;
 
     glEnd();
-{$ENDIF}
 
     glDisable(GL_BLEND);
   end;