hedgewars/uRender.pas
branchqmlfrontend
changeset 10515 7705784902e1
parent 10404 1baaab44a0b2
parent 10494 0eb97cf4c78e
child 10606 8e95911cb86b
--- a/hedgewars/uRender.pas	Sun Nov 09 23:02:21 2014 +0300
+++ b/hedgewars/uRender.pas	Tue Nov 18 23:39:30 2014 +0300
@@ -279,7 +279,7 @@
 {$ENDIF}
 end;
 
-{$IF DEFINED(USE_S3D_RENDERING) OR DEFINED(USE_VIDEO_RECORDING)}
+{$IFDEF USE_S3D_RENDERING OR USE_VIDEO_RECORDING}
 procedure CreateFramebuffer(var frame, depth, tex: GLuint);
 begin
     glGenFramebuffersEXT(1, @frame);
@@ -417,8 +417,8 @@
     UpdateModelviewProjection;
 {$ENDIF}
 
-{$IFNDEF USE_S3D_RENDERING}
-    if (cStereoMode = smHorizontal) or (cStereoMode = smVertical) or (cStereoMode = smAFR) then
+{$IFDEF USE_S3D_RENDERING}
+    if (cStereoMode = smHorizontal) or (cStereoMode = smVertical) then
     begin
         // prepare left and right frame buffers and associated textures
         if glLoadExtension('GL_EXT_framebuffer_object') then
@@ -848,10 +848,29 @@
 var ft, fb, fl, fr: GLfloat;
     hw, hh, nx, ny: LongInt;
 begin
-
-// note: not taking scale into account
-if isAreaOffscreen(X, Y, w, h) then
-    exit;
+// visibility check only under trivial conditions
+if (Scale <= 1) then
+    begin
+    if Angle <> 0  then
+        begin
+        if (OffsetX = 0) and (OffsetY = 0) then
+            begin
+            // sized doubled because the sprite might occupy up to 1.4 * of it's
+            // original size in each dimension, because it is rotated
+            if isDxAreaOffscreen(X - w, 2 * w) <> 0 then
+                exit;
+            if isDYAreaOffscreen(Y - h, 2 * h) <> 0 then
+                exit;
+            end;
+        end
+    else
+        begin
+        if isDxAreaOffscreen(X + dir * trunc(OffsetX) - w div 2, w) <> 0 then
+            exit;
+        if isDYAreaOffscreen(Y + trunc(OffsetY) - h div 2, h) <> 0 then
+            exit;
+        end;
+    end;
 
 {
 // do not draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs)
@@ -1462,8 +1481,8 @@
 else
     PrepareVbForWater(true,
         OffsetY + WorldDy + cWaterLine, ViewTopY,
-        LeftX  + WorldDx - OffsetX, ViewLeftX,
-        RightX + WorldDx + OffsetX, ViewRightX,
+        LongInt(LeftX)  + WorldDx - OffsetX, ViewLeftX,
+        LongInt(RightX) + WorldDx + OffsetX, ViewRightX,
         ViewBottomY,
         first, count);
 
@@ -1541,8 +1560,8 @@
 dY:= -cWaveHeight + dy;
 ox:= -cWaveHeight + ox;
 
-lx:= LeftX  + WorldDx - ox;
-rx:= RightX + WorldDx + ox;
+lx:= LongInt(LeftX)  + WorldDx - ox;
+rx:= LongInt(RightX) + WorldDx + ox;
 
 topy:= cWaterLine + WorldDy + dY;