diff Render.cpp @ 2207:ff8920a40c21

fixpoint_mul
author Ritor1
date Thu, 06 Feb 2014 17:20:12 +0600
parents 15a327be07e2
children e9625ad08541
line wrap: on
line diff
--- a/Render.cpp	Thu Feb 06 00:38:03 2014 +0600
+++ b/Render.cpp	Thu Feb 06 17:20:12 2014 +0600
@@ -998,10 +998,7 @@
           v37 = v10;
           v12 = v42;
           v38 = 0;
-          v13 = ((signed int)(stru_5C6E00->uIntegerPi
-                            + ((signed int)stru_5C6E00->uIntegerPi >> 3)
-                            + v11
-                            - (signed int)v37) >> 8) & 7;
+          v13 = ((signed int)(stru_5C6E00->uIntegerPi + ((signed int)stru_5C6E00->uIntegerPi >> 3) + v11 - (signed int)v37) >> 8) & 7;
           v37 = (unsigned __int16 *)v13;
           if ( v42 & 2 )
             v38 = 2;
@@ -1026,37 +1023,29 @@
               v15 = 255;
             }
             b = v16;
-            pStationaryLightsStack->AddLight(
-              decor->vPosition.x,
-              decor->vPosition.y,
-              decor->vPosition.z + decor_desc->uDecorationHeight / 2,
-              a5,
-              v14,
-              v15,
-              v16,
-              _4E94D0_light_type);
+            pStationaryLightsStack->AddLight(decor->vPosition.x, decor->vPosition.y, decor->vPosition.z + decor_desc->uDecorationHeight / 2,
+              a5, v14, v15, v16, _4E94D0_light_type);
           }
           v17 = (decor->vPosition.x - pGame->pIndoorCameraD3D->vPartyPos.x) << 16;
           if (pGame->pIndoorCameraD3D->sRotationX)
           {
             v40 = (decor->vPosition.y - pGame->pIndoorCameraD3D->vPartyPos.y) << 16;
-            v18 = ((unsigned __int64)(v17 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_y) >> 16)
-                + ((unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_y) >> 16);
+            v18 = fixpoint_mul(v17, pGame->pIndoorCameraD3D->int_cosine_y) + fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_sine_y);
             v42 = v18;
-            b = (unsigned __int64)(v17 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_y) >> 16;
-            a5 = (unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_y) >> 16;
+            b = fixpoint_mul(v17, pGame->pIndoorCameraD3D->int_sine_y);
+            a5 = fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_cosine_y);
             v40 = (decor->vPosition.z - pGame->pIndoorCameraD3D->vPartyPos.z) << 16;
-            v41 = (unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_x) >> 16;
-            v19 = (unsigned __int64)(v18 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_x) >> 16;
-            v20 = v19 + ((unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_x) >> 16);
-            v39 = v19 + ((unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_x) >> 16);
-            if ( v20 >= 262144 && v20 <= pODMRenderParams->shading_dist_mist << 16 )
+            v41 = fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_sine_x);
+            v19 = fixpoint_mul(v18, pGame->pIndoorCameraD3D->int_cosine_x);
+            v20 = v19 + fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_sine_x);
+            v39 = v19 + fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_sine_x);
+            if ( v20 >= 0x40000 && v20 <= pODMRenderParams->shading_dist_mist << 16 )
             {
               v21 = a5 - b;
               v41 = a5 - b;
-              a5 = (unsigned __int64)(v42 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_x) >> 16;
-              b = (unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_x) >> 16;
-              v22 = ((unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_x) >> 16) - a5;
+              //a5 = fixpoint_mul(v42, pGame->pIndoorCameraD3D->int_sine_x);
+              b = fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_cosine_x);
+              v22 = fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_cosine_x) - fixpoint_mul(v42, pGame->pIndoorCameraD3D->int_sine_x);
 LABEL_30:
               v42 = v22;
               v40 = 2 * abs(v20);
@@ -1066,26 +1055,24 @@
                 LODWORD(v24) = 0;
                 HIDWORD(v24) = SLOWORD(pODMRenderParams->int_fov_rad);
                 a5 = v24 / v39;
-                v25 = pViewport->uScreenCenterX
-                    - ((signed int)(((unsigned __int64)(v24 / v39 * v41) >> 16) + 32768) >> 16);
-                b = (unsigned __int64)(a5 * (signed __int64)v42) >> 16;
+                v25 = pViewport->uScreenCenterX - ((signed int)(fixpoint_mul(v24 / v39, v41) + 0x8000) >> 16);
+                b = fixpoint_mul(a5, v42);
                 v41 = v24 / v39;
-                v40 = pViewport->uScreenCenterY
-                    - ((signed int)(((unsigned __int64)(a5 * (signed __int64)v42) >> 16) + 32768) >> 16);
-                v42 = v8->scale;
-                v41 = (unsigned __int64)(v42 * v24 / v39) >> 16;
+                v40 = pViewport->uScreenCenterY - ((signed int)(fixpoint_mul(a5, v42) + 0x8000) >> 16);
+                //v42 = v8->scale;
+                v41 = fixpoint_mul(v8->scale, v24 / v39);
                 v37 = (unsigned __int16 *)&v8->pHwSpriteIDs[(int)v37];
                 if ( pRenderer->pRenderD3D )
                 {
                   v26 = v41;
-                  v42 = pSprites_LOD->pHardwareSprites[(signed __int16)*v37].uBufferWidth >> 1;
-                  b = (unsigned __int64)(v42 * (signed __int64)v41) >> 16;
+                  //v42 = pSprites_LOD->pHardwareSprites[(signed __int16)*v37].uBufferWidth / 2;
+                  b = fixpoint_mul(pSprites_LOD->pHardwareSprites[(signed __int16)*v37].uBufferWidth / 2, v41);
                 }
                 else
                 {
                   v26 = v41;
-                  v42 = pSprites_LOD->pSpriteHeaders[(signed __int16)*v37].uWidth >> 1;
-                  b = (unsigned __int64)(v42 * (signed __int64)v41) >> 16;
+                  //v42 = pSprites_LOD->pSpriteHeaders[(signed __int16)*v37].uWidth / 2;
+                  b = fixpoint_mul(pSprites_LOD->pSpriteHeaders[(signed __int16)*v37].uWidth / 2, v41);
                 }
                 if ( b + v25 >= (signed int)pViewport->uViewportTL_X && v25 - b <= (signed int)pViewport->uViewportBR_X )
                 {
@@ -1123,16 +1110,16 @@
           {
             v42 = (decor->vPosition.x - pGame->pIndoorCameraD3D->vPartyPos.x) << 16;
             v40 = (decor->vPosition.y - pGame->pIndoorCameraD3D->vPartyPos.y) << 16;
-            b = (unsigned __int64)(v17 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_y) >> 16;
-            a5 = (unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_y) >> 16;
-            v20 = b + ((unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_y) >> 16);
-            v39 = b + ((unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_y) >> 16);
-            if ( v20 >= 262144 && v20 <= pODMRenderParams->shading_dist_mist << 16 )
+            b = fixpoint_mul(v17, pGame->pIndoorCameraD3D->int_cosine_y);
+            a5 = fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_sine_y);
+            v20 = b + fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_sine_y);
+            v39 = b + fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_sine_y);
+            if ( v20 >= 0x40000 && v20 <= pODMRenderParams->shading_dist_mist << 16 )
             {
-              a5 = (unsigned __int64)(v42 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_y) >> 16;
-              b = (unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_y) >> 16;
-              v21 = ((unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_y) >> 16) - a5;
-              v41 = ((unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_y) >> 16) - a5;
+              a5 = fixpoint_mul(v42, pGame->pIndoorCameraD3D->int_sine_y);
+              b = fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_cosine_y);
+              v21 = fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_cosine_y) - a5;
+              v41 = fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_cosine_y) - a5;
               v22 = (decor->vPosition.z - pGame->pIndoorCameraD3D->vPartyPos.z) << 16;
               goto LABEL_30;
             }
@@ -4959,13 +4946,13 @@
   for ( _507D30_idx; _507D30_idx < pSkyPolygon.uNumVertices; _507D30_idx++ )
   {
     //v15 = (void *)(v72 * (v70 - (int)array_507D30[_507D30_idx].vWorldViewProjY));
-    v77 = (unsigned __int64)(pSkyPolygon.ptr_38->viewing_angle_from_west_east * (signed __int64)(v72 * (v70 - array_507D30[_507D30_idx].vWorldViewProjY))) >> 16;
+    v77 = fixpoint_mul(pSkyPolygon.ptr_38->viewing_angle_from_west_east, v72 * (v70 - array_507D30[_507D30_idx].vWorldViewProjY));
     v74 = v77 + pSkyPolygon.ptr_38->angle_from_north;
 
-    v77 = (unsigned __int64)(pSkyPolygon.ptr_38->viewing_angle_from_north_south * (signed __int64)(v72 * (v70 - array_507D30[_507D30_idx].vWorldViewProjY))) >> 16;
+    v77 = fixpoint_mul(pSkyPolygon.ptr_38->viewing_angle_from_north_south, v72 * (v70 - array_507D30[_507D30_idx].vWorldViewProjY));
     v74_ = v77 + pSkyPolygon.ptr_38->angle_from_east;
 
-    v79 = (void *)(((unsigned __int64)(pSkyPolygon.v_18.z * (signed __int64)v72 * (v70 - (int)array_507D30[_507D30_idx].vWorldViewProjY))) >> 16);
+    v79 = (void *)(fixpoint_mul(pSkyPolygon.v_18.z, v72 * (v70 - (int)array_507D30[_507D30_idx].vWorldViewProjY)));
     v17 = v72 * (pBLVRenderParams->uViewportCenterX - (int)array_507D30[_507D30_idx].vWorldViewProjX);
     v18 = array_507D30[_507D30_idx].vWorldViewProjY - 1.0;
     v19 = -pSkyPolygon.field_24;
@@ -4986,8 +4973,8 @@
       v19 = v77;
       v20 = v79;
 LABEL_14:
-      v79 = (void *)((unsigned __int64)(pSkyPolygon.v_18.z * (signed __int64)(signed int)v20) >> 16);
-      v22 = (unsigned __int64)(pSkyPolygon.v_18.z * (signed __int64)(signed int)v20) >> 16;
+      v79 = (void *)fixpoint_mul(pSkyPolygon.v_18.z, (int)v20);
+      v22 = fixpoint_mul(pSkyPolygon.v_18.z, (int)v20);
       --LODWORD(v76);
       v20 = (char *)v20 + v72;
       X = v22 + pSkyPolygon.v_18.x;
@@ -4999,16 +4986,16 @@
       HIDWORD(v23) = v77 >> 16;//v23 = 0xfffffe0000000000
       v79 = (void *)(v23 / X);//X = FFFF9014(-28652)
       v77 = v17;
-      signed __int64 s = v74 + ((pSkyPolygon.ptr_38->angle_from_west * (signed __int64)v17) >> 16);// s = 0xFFFFFFFF FFFF3EE6
-      LODWORD(v80) = v66 + ((signed int)((unsigned __int64)(SLODWORD(s) * (v23 / X)) >> 16) >> 4);
+      signed __int64 s = v74 + fixpoint_mul(pSkyPolygon.ptr_38->angle_from_west, v17);// s = 0xFFFFFFFF FFFF3EE6
+      LODWORD(v80) = v66 + ((signed int)fixpoint_mul(SLODWORD(s), v23 / X) >> 4);
       array_507D30[_507D30_idx].u = ((double)SLODWORD(v80) * 0.000015259022) * (1.0 / (double)pSkyPolygon.pTexture->uTextureWidth);
 
-      signed __int64 s2 = (signed __int64)(v74_ + ((unsigned __int64)(pSkyPolygon.ptr_38->angle_from_south * (signed __int64)v17) >> 16));
-      LODWORD(v80) = v63 + ((signed int)((unsigned __int64)(SLODWORD(s2) * (v23 / X)) >> 16) >> 4);
+      signed __int64 s2 = v74_ + fixpoint_mul(pSkyPolygon.ptr_38->angle_from_south, v17);
+      LODWORD(v80) = v63 + ((signed int)fixpoint_mul(SLODWORD(s2), v23 / X) >> 4);
       array_507D30[_507D30_idx].v = ((double)SLODWORD(v80) * 0.000015259022) * v68;
 
-      v77 = (unsigned __int64)(SLODWORD(s) * (v23 / X)) >> 16;
-      LODWORD(v73) = (unsigned __int64)(SLODWORD(s2) * (v23 / X)) >> 16;
+      v77 = fixpoint_mul(SLODWORD(s), v23 / X);
+      LODWORD(v73) = fixpoint_mul(SLODWORD(s2), v23 / X);
       array_507D30[_507D30_idx]._rhw = 65536.0 / (double)(signed int)v79;
 
       //if ( (int)v81 >= pSkyPolygon.uNumVertices )
@@ -5073,19 +5060,18 @@
     v35 = (const void *)(v72 * (v70 - (unsigned __int64)(signed __int64)array_50AC10[j].vWorldViewProjY));
 
     //v78 = pSkyPolygon.ptr_38->viewing_angle_from_west_east;
-    v81 = (const void *)((unsigned __int64)(pSkyPolygon.ptr_38->viewing_angle_from_west_east * (signed __int64)(signed int)v35) >> 16);
-    v36 = (int)((char *)v81 + pSkyPolygon.ptr_38->angle_from_north);
+    //v81 = (const void *)fixpoint_mul(pSkyPolygon.ptr_38->viewing_angle_from_west_east, v35);
+    v36 = (int)(fixpoint_mul(pSkyPolygon.ptr_38->viewing_angle_from_west_east, (int)v35) + pSkyPolygon.ptr_38->angle_from_north);
 
     v81 = v35;
     v74 = v36;
     //v78 = pSkyPolygon.ptr_38->viewing_angle_from_north_south;
-    v81 = (const void *)((unsigned __int64)(pSkyPolygon.ptr_38->viewing_angle_from_north_south * (signed __int64)(signed int)v35) >> 16);
+    v81 = (const void *)fixpoint_mul(pSkyPolygon.ptr_38->viewing_angle_from_north_south, (int)v35);
     v78 = (int)v35;
     v75 = (RenderVertexSoft *)((char *)v81 + pSkyPolygon.ptr_38->angle_from_east);
-    v81 = (const void *)pSkyPolygon.v_18.z;
-    v78 = (unsigned __int64)(pSkyPolygon.v_18.z * (signed __int64)(signed int)v35) >> 16;
-    v37 = (const void *)(v72
-                       * (pBLVRenderParams->uViewportCenterX - (unsigned __int64)(signed __int64)array_50AC10[j].vWorldViewProjX));
+    //v81 = (const void *)pSkyPolygon.v_18.z;
+    v78 = fixpoint_mul(pSkyPolygon.v_18.z, (int)v35);
+    v37 = (const void *)(v72 * (pBLVRenderParams->uViewportCenterX - (unsigned __int64)(signed __int64)array_50AC10[j].vWorldViewProjX));
     v38 = (signed __int64)(array_50AC10[j].vWorldViewProjY - 1.0);
     v81 = 0;
     LODWORD(v76) = v38;
@@ -5103,7 +5089,7 @@
       v39 = v78;
 LABEL_36:
       v78 = pSkyPolygon.v_18.z;
-      v41 = (unsigned __int64)(pSkyPolygon.v_18.z * (signed __int64)v39) >> 16;
+      v41 = fixpoint_mul(pSkyPolygon.v_18.z, v39);
       --LODWORD(v76);
       v39 += v72;
       X = v41 + pSkyPolygon.v_18.x;
@@ -5113,11 +5099,8 @@
     {
       v79 = (void *)pSkyPolygon.v_18.z;
       v78 = 2 * LODWORD(v76);
-      v81 = (const void *)((unsigned __int64)(pSkyPolygon.v_18.z
-                                            * (signed __int64)(signed int)(signed __int64)(((double)v70
-                                                                                          - ((double)(2 * LODWORD(v76))
-                                                                                           - array_50AC10[j].vWorldViewProjY))
-                                                                                         * (double)v72)) >> 16);
+      v81 = (const void *)fixpoint_mul(pSkyPolygon.v_18.z, (((double)v70 - ((double)(2 * LODWORD(v76)) - array_50AC10[j].vWorldViewProjY))
+                                                                                         * (double)v72));
       X = (int)((char *)v81 + pSkyPolygon.v_18.x);
     }
     LODWORD(v42) = v77 << 16;
@@ -5126,23 +5109,23 @@
     v81 = v37;
 
     //v78 = pSkyPolygon.ptr_38->angle_from_west;
-    v81 = (const void *)((unsigned __int64)(pSkyPolygon.ptr_38->angle_from_west * (signed __int64)(signed int)v37) >> 16);
-    v43 = v74 + ((unsigned __int64)(pSkyPolygon.ptr_38->angle_from_west * (signed __int64)(signed int)v37) >> 16);
+    v81 = (const void *)fixpoint_mul(pSkyPolygon.ptr_38->angle_from_west, (int)v37);
+    v43 = v74 + fixpoint_mul(pSkyPolygon.ptr_38->angle_from_west, (int)v37);
     v74 = (unsigned int)v37;
     LODWORD(v76) = v43;
 
     //v78 = pSkyPolygon.ptr_38->angle_from_south;
-    v75 = (RenderVertexSoft *)((char *)v75 + ((unsigned __int64)(pSkyPolygon.ptr_38->angle_from_south * (signed __int64)(signed int)v37) >> 16));
-    v74 = (unsigned __int64)(v43 * v42 / X) >> 16;
-    v81 = (const void *)((unsigned __int64)((signed int)v75 * v42 / X) >> 16);
+    v75 = (RenderVertexSoft *)((char *)v75 + fixpoint_mul(pSkyPolygon.ptr_38->angle_from_south, (int)v37));
+    //v74 = fixpoint_mul(v43, v42 / X);
+    v81 = (const void *)fixpoint_mul((int)v75, v42 / X);
 
     //v34 += 48;
-    v78 = v66 + ((signed int)v74 >> 4);
+    //v78 = v66 + ((signed int)fixpoint_mul(v43, v42 / X) >> 4);
     //v44 = HIDWORD(v69)-- == 1;
-    v45 = (double)v78 * 0.000015259022;
-    v78 = v63 + ((signed int)((unsigned __int64)((signed int)v75 * v42 / X) >> 16) >> 4);
-    array_50AC10[j].u = v45 * (1.0 / (double)pSkyPolygon.pTexture->uTextureWidth);
-    array_50AC10[j].v = (double)v78 * 0.000015259022 * v68;
+    //v45 = (double)(v66 + ((signed int)fixpoint_mul(v43, v42 / X) >> 4)) * 0.000015259022;
+    //v78 = v63 + ((signed int)fixpoint_mul((int)v75, v42 / X) >> 4);
+    array_50AC10[j].u = ((double)(v66 + ((signed int)fixpoint_mul(v43, v42 / X) >> 4)) * 0.000015259022) * (1.0 / (double)pSkyPolygon.pTexture->uTextureWidth);
+    array_50AC10[j].v = ((double)(v66 + ((signed int)fixpoint_mul(v43, v42 / X) >> 4)) * 0.000015259022) * v68;
     //v46 = (double)(signed int)v79;
     array_50AC10[j].vWorldViewPosition.x = 0.000015258789 * (double)(signed int)v79;
     array_50AC10[j]._rhw = 65536.0 / (double)(signed int)v79;
@@ -8749,10 +8732,10 @@
             array_77EC08[pODMRenderParams->uNumPolygons].pODMFace = &pOutdoor->pBModels[model_id].pFaces[face_id];
             array_77EC08[pODMRenderParams->uNumPolygons].uNumVertices = pOutdoor->pBModels[model_id].pFaces[face_id].uNumVertices;
             array_77EC08[pODMRenderParams->uNumPolygons].field_59 = 5;
-            v51 = (unsigned __int64)(-pOutdoor->vSunlight.x * (signed __int64)pOutdoor->pBModels[model_id].pFaces[face_id].pFacePlane.vNormal.x) >> 16;
-            v53 = (unsigned __int64)(-pOutdoor->vSunlight.y * (signed __int64)pOutdoor->pBModels[model_id].pFaces[face_id].pFacePlane.vNormal.y) >> 16;
-            v52 = (unsigned __int64)(-pOutdoor->vSunlight.z * (signed __int64)pOutdoor->pBModels[model_id].pFaces[face_id].pFacePlane.vNormal.z) >> 16;
-            array_77EC08[pODMRenderParams->uNumPolygons].dimming_level = 20 - (20 * (signed int)(v51 + v53 + v52) >> 16);
+            v51 = fixpoint_mul(-pOutdoor->vSunlight.x, pOutdoor->pBModels[model_id].pFaces[face_id].pFacePlane.vNormal.x);
+            v53 = fixpoint_mul(-pOutdoor->vSunlight.y, pOutdoor->pBModels[model_id].pFaces[face_id].pFacePlane.vNormal.y);
+            v52 = fixpoint_mul(-pOutdoor->vSunlight.z, pOutdoor->pBModels[model_id].pFaces[face_id].pFacePlane.vNormal.z);
+            array_77EC08[pODMRenderParams->uNumPolygons].dimming_level = 20 - fixpoint_mul(20, v51 + v53 + v52);
             if ( array_77EC08[pODMRenderParams->uNumPolygons].dimming_level < 0 )
               array_77EC08[pODMRenderParams->uNumPolygons].dimming_level = 0;
             if ( array_77EC08[pODMRenderParams->uNumPolygons].dimming_level > 31 )
@@ -8915,13 +8898,13 @@
       // направление на север и/или юг (либо на восток и/или запад), значению 65536 еденицам(0х10000) соответствует угол 90.
       // две переменные хранят данные по углу обзора. field_14 по западу и востоку. field_20 по югу и северу
       // от -25080 до 25080
-      v39 = (unsigned __int64)(pSkyPolygon.ptr_38->viewing_angle_from_west_east * (signed __int64)(v33 * (v30 - floor(array_50AC10[i].vWorldViewProjY + 0.5)))) >> 16;
+      v39 = fixpoint_mul(pSkyPolygon.ptr_38->viewing_angle_from_west_east, v33 * (v30 - floor(array_50AC10[i].vWorldViewProjY + 0.5)));
       v35 = v39 + pSkyPolygon.ptr_38->angle_from_north;
 
-      v39 = (unsigned __int64)(pSkyPolygon.ptr_38->viewing_angle_from_north_south * (signed __int64)(v33 * (v30 - floor(array_50AC10[i].vWorldViewProjY + 0.f)))) >> 16;
+      v39 = fixpoint_mul(pSkyPolygon.ptr_38->viewing_angle_from_north_south, v33 * (v30 - floor(array_50AC10[i].vWorldViewProjY + 0.f)));
       v36 = v39 + pSkyPolygon.ptr_38->angle_from_east;
 
-      v9 = (unsigned __int64)(pSkyPolygon.v_18.z * (signed __int64)(v33 * (v30 - floor(array_50AC10[i].vWorldViewProjY + 0.5)))) >> 16;
+      v9 = fixpoint_mul(pSkyPolygon.v_18.z, v33 * (v30 - floor(array_50AC10[i].vWorldViewProjY + 0.5)));
       v10 = pSkyPolygon.v_18.x + v9;
       if ( v10 > 0 )
         v10 = 0;
@@ -8941,7 +8924,7 @@
               break;
           }
         }
-        v16 = (unsigned __int64)(pSkyPolygon.v_18.z * (signed __int64)v14) >> 16;
+        v16 = fixpoint_mul(pSkyPolygon.v_18.z, v14);
         --v32;
         v14 += v33;
         v10 = pSkyPolygon.v_18.x + v16;
@@ -8951,14 +8934,12 @@
       v18 = v17 / v10;
       if ( v18 < 0 )
         v18 = pODMRenderParams->shading_dist_mist;
-      v37 = v35 + ((unsigned __int64)(pSkyPolygon.ptr_38->angle_from_west * (signed __int64)v13) >> 16);
-      v35 = 224 * pMiscTimer->uTotalGameTimeElapsed
-          + ((signed int)((unsigned __int64)(v37 * (signed __int64)v18) >> 16) >> 3);
+      v37 = v35 + fixpoint_mul(pSkyPolygon.ptr_38->angle_from_west, v13);
+      v35 = 224 * pMiscTimer->uTotalGameTimeElapsed + ((signed int)fixpoint_mul(v37, v18) >> 3);
       array_50AC10[i].u = (double)v35 / ((double)pSkyPolygon.pTexture->uTextureWidth * 65536.0);
 
-      v36 = v36 + ((unsigned __int64)(pSkyPolygon.ptr_38->angle_from_south * (signed __int64)v13) >> 16);
-      v35 = 224 * pMiscTimer->uTotalGameTimeElapsed
-         + ((signed int)((unsigned __int64)(v36 * (signed __int64)v18) >> 16) >> 3);
+      v36 = v36 + fixpoint_mul(pSkyPolygon.ptr_38->angle_from_south, v13);
+      v35 = 224 * pMiscTimer->uTotalGameTimeElapsed + ((signed int)fixpoint_mul(v36, v18) >> 3);
       array_50AC10[i].v = (double)v35 / ((double)pSkyPolygon.pTexture->uTextureHeight * 65536.0);
 
       array_50AC10[i].vWorldViewPosition.x = (double)0x2000;//pODMRenderParams->shading_dist_mist 8192
@@ -9039,6 +9020,19 @@
       for (uint x = 0; x < width; ++x)
       {
         //*v3 = pRenderer->ReadPixel16((int)(x* interval_x + 8.0), (int)(y * interval_y + 8.0));//screen_data[screen_y + (int)(x* interval_x + 8.0)];
+		  /*
+        if (ddpfPrimarySuface.dwRGBBitCount == 32)
+        {
+          auto p = (unsigned __int32 *)pRenderer->pTargetSurface + (int)(x * interval_x + 8.0) + (int)(y * interval_y + 8.0) * pRenderer->uTargetSurfacePitch;
+          *v3 = Color16((*p >> 16) & 255, (*p >> 8) & 255, *p & 255);
+        }
+        else if (ddpfPrimarySuface.dwRGBBitCount == 16)
+        {
+          auto p = (unsigned __int16 *)pRenderer->pTargetSurface + (int)(x * interval_x + 8.0) + (int)(y * interval_y + 8.0) * pRenderer->uTargetSurfacePitch;
+          *v3 = *p;
+        }
+		  */
+		  pRenderer->pTargetSurface;
         if (Dst.ddpfPixelFormat.dwRGBBitCount == 32)
         {
           auto p = (unsigned __int32 *)Dst.lpSurface + (int)(x * interval_x + 8.0) + y/* (int)(y * interval_y + 8.0)*/ * Dst.lPitch;