comparison Render.cpp @ 2207:ff8920a40c21

fixpoint_mul
author Ritor1
date Thu, 06 Feb 2014 17:20:12 +0600
parents 15a327be07e2
children e9625ad08541
comparison
equal deleted inserted replaced
2206:15a327be07e2 2207:ff8920a40c21
996 decor->vPosition.y - pGame->pIndoorCameraD3D->vPartyPos.y); 996 decor->vPosition.y - pGame->pIndoorCameraD3D->vPartyPos.y);
997 v11 = *((int *)v0 + 2); 997 v11 = *((int *)v0 + 2);
998 v37 = v10; 998 v37 = v10;
999 v12 = v42; 999 v12 = v42;
1000 v38 = 0; 1000 v38 = 0;
1001 v13 = ((signed int)(stru_5C6E00->uIntegerPi 1001 v13 = ((signed int)(stru_5C6E00->uIntegerPi + ((signed int)stru_5C6E00->uIntegerPi >> 3) + v11 - (signed int)v37) >> 8) & 7;
1002 + ((signed int)stru_5C6E00->uIntegerPi >> 3)
1003 + v11
1004 - (signed int)v37) >> 8) & 7;
1005 v37 = (unsigned __int16 *)v13; 1002 v37 = (unsigned __int16 *)v13;
1006 if ( v42 & 2 ) 1003 if ( v42 & 2 )
1007 v38 = 2; 1004 v38 = 2;
1008 if ( (256 << v13) & v42 ) 1005 if ( (256 << v13) & v42 )
1009 v38 |= 4u; 1006 v38 |= 4u;
1024 v16 = 255; 1021 v16 = 255;
1025 v14 = 255; 1022 v14 = 255;
1026 v15 = 255; 1023 v15 = 255;
1027 } 1024 }
1028 b = v16; 1025 b = v16;
1029 pStationaryLightsStack->AddLight( 1026 pStationaryLightsStack->AddLight(decor->vPosition.x, decor->vPosition.y, decor->vPosition.z + decor_desc->uDecorationHeight / 2,
1030 decor->vPosition.x, 1027 a5, v14, v15, v16, _4E94D0_light_type);
1031 decor->vPosition.y,
1032 decor->vPosition.z + decor_desc->uDecorationHeight / 2,
1033 a5,
1034 v14,
1035 v15,
1036 v16,
1037 _4E94D0_light_type);
1038 } 1028 }
1039 v17 = (decor->vPosition.x - pGame->pIndoorCameraD3D->vPartyPos.x) << 16; 1029 v17 = (decor->vPosition.x - pGame->pIndoorCameraD3D->vPartyPos.x) << 16;
1040 if (pGame->pIndoorCameraD3D->sRotationX) 1030 if (pGame->pIndoorCameraD3D->sRotationX)
1041 { 1031 {
1042 v40 = (decor->vPosition.y - pGame->pIndoorCameraD3D->vPartyPos.y) << 16; 1032 v40 = (decor->vPosition.y - pGame->pIndoorCameraD3D->vPartyPos.y) << 16;
1043 v18 = ((unsigned __int64)(v17 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_y) >> 16) 1033 v18 = fixpoint_mul(v17, pGame->pIndoorCameraD3D->int_cosine_y) + fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_sine_y);
1044 + ((unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_y) >> 16);
1045 v42 = v18; 1034 v42 = v18;
1046 b = (unsigned __int64)(v17 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_y) >> 16; 1035 b = fixpoint_mul(v17, pGame->pIndoorCameraD3D->int_sine_y);
1047 a5 = (unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_y) >> 16; 1036 a5 = fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_cosine_y);
1048 v40 = (decor->vPosition.z - pGame->pIndoorCameraD3D->vPartyPos.z) << 16; 1037 v40 = (decor->vPosition.z - pGame->pIndoorCameraD3D->vPartyPos.z) << 16;
1049 v41 = (unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_x) >> 16; 1038 v41 = fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_sine_x);
1050 v19 = (unsigned __int64)(v18 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_x) >> 16; 1039 v19 = fixpoint_mul(v18, pGame->pIndoorCameraD3D->int_cosine_x);
1051 v20 = v19 + ((unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_x) >> 16); 1040 v20 = v19 + fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_sine_x);
1052 v39 = v19 + ((unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_x) >> 16); 1041 v39 = v19 + fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_sine_x);
1053 if ( v20 >= 262144 && v20 <= pODMRenderParams->shading_dist_mist << 16 ) 1042 if ( v20 >= 0x40000 && v20 <= pODMRenderParams->shading_dist_mist << 16 )
1054 { 1043 {
1055 v21 = a5 - b; 1044 v21 = a5 - b;
1056 v41 = a5 - b; 1045 v41 = a5 - b;
1057 a5 = (unsigned __int64)(v42 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_x) >> 16; 1046 //a5 = fixpoint_mul(v42, pGame->pIndoorCameraD3D->int_sine_x);
1058 b = (unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_x) >> 16; 1047 b = fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_cosine_x);
1059 v22 = ((unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_x) >> 16) - a5; 1048 v22 = fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_cosine_x) - fixpoint_mul(v42, pGame->pIndoorCameraD3D->int_sine_x);
1060 LABEL_30: 1049 LABEL_30:
1061 v42 = v22; 1050 v42 = v22;
1062 v40 = 2 * abs(v20); 1051 v40 = 2 * abs(v20);
1063 v23 = abs(v21); 1052 v23 = abs(v21);
1064 if ( v40 >= v23 ) 1053 if ( v40 >= v23 )
1065 { 1054 {
1066 LODWORD(v24) = 0; 1055 LODWORD(v24) = 0;
1067 HIDWORD(v24) = SLOWORD(pODMRenderParams->int_fov_rad); 1056 HIDWORD(v24) = SLOWORD(pODMRenderParams->int_fov_rad);
1068 a5 = v24 / v39; 1057 a5 = v24 / v39;
1069 v25 = pViewport->uScreenCenterX 1058 v25 = pViewport->uScreenCenterX - ((signed int)(fixpoint_mul(v24 / v39, v41) + 0x8000) >> 16);
1070 - ((signed int)(((unsigned __int64)(v24 / v39 * v41) >> 16) + 32768) >> 16); 1059 b = fixpoint_mul(a5, v42);
1071 b = (unsigned __int64)(a5 * (signed __int64)v42) >> 16;
1072 v41 = v24 / v39; 1060 v41 = v24 / v39;
1073 v40 = pViewport->uScreenCenterY 1061 v40 = pViewport->uScreenCenterY - ((signed int)(fixpoint_mul(a5, v42) + 0x8000) >> 16);
1074 - ((signed int)(((unsigned __int64)(a5 * (signed __int64)v42) >> 16) + 32768) >> 16); 1062 //v42 = v8->scale;
1075 v42 = v8->scale; 1063 v41 = fixpoint_mul(v8->scale, v24 / v39);
1076 v41 = (unsigned __int64)(v42 * v24 / v39) >> 16;
1077 v37 = (unsigned __int16 *)&v8->pHwSpriteIDs[(int)v37]; 1064 v37 = (unsigned __int16 *)&v8->pHwSpriteIDs[(int)v37];
1078 if ( pRenderer->pRenderD3D ) 1065 if ( pRenderer->pRenderD3D )
1079 { 1066 {
1080 v26 = v41; 1067 v26 = v41;
1081 v42 = pSprites_LOD->pHardwareSprites[(signed __int16)*v37].uBufferWidth >> 1; 1068 //v42 = pSprites_LOD->pHardwareSprites[(signed __int16)*v37].uBufferWidth / 2;
1082 b = (unsigned __int64)(v42 * (signed __int64)v41) >> 16; 1069 b = fixpoint_mul(pSprites_LOD->pHardwareSprites[(signed __int16)*v37].uBufferWidth / 2, v41);
1083 } 1070 }
1084 else 1071 else
1085 { 1072 {
1086 v26 = v41; 1073 v26 = v41;
1087 v42 = pSprites_LOD->pSpriteHeaders[(signed __int16)*v37].uWidth >> 1; 1074 //v42 = pSprites_LOD->pSpriteHeaders[(signed __int16)*v37].uWidth / 2;
1088 b = (unsigned __int64)(v42 * (signed __int64)v41) >> 16; 1075 b = fixpoint_mul(pSprites_LOD->pSpriteHeaders[(signed __int16)*v37].uWidth / 2, v41);
1089 } 1076 }
1090 if ( b + v25 >= (signed int)pViewport->uViewportTL_X && v25 - b <= (signed int)pViewport->uViewportBR_X ) 1077 if ( b + v25 >= (signed int)pViewport->uViewportTL_X && v25 - b <= (signed int)pViewport->uViewportBR_X )
1091 { 1078 {
1092 if (::uNumBillboardsToDraw >= 500) 1079 if (::uNumBillboardsToDraw >= 500)
1093 return; 1080 return;
1121 } 1108 }
1122 else 1109 else
1123 { 1110 {
1124 v42 = (decor->vPosition.x - pGame->pIndoorCameraD3D->vPartyPos.x) << 16; 1111 v42 = (decor->vPosition.x - pGame->pIndoorCameraD3D->vPartyPos.x) << 16;
1125 v40 = (decor->vPosition.y - pGame->pIndoorCameraD3D->vPartyPos.y) << 16; 1112 v40 = (decor->vPosition.y - pGame->pIndoorCameraD3D->vPartyPos.y) << 16;
1126 b = (unsigned __int64)(v17 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_y) >> 16; 1113 b = fixpoint_mul(v17, pGame->pIndoorCameraD3D->int_cosine_y);
1127 a5 = (unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_y) >> 16; 1114 a5 = fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_sine_y);
1128 v20 = b + ((unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_y) >> 16); 1115 v20 = b + fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_sine_y);
1129 v39 = b + ((unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_y) >> 16); 1116 v39 = b + fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_sine_y);
1130 if ( v20 >= 262144 && v20 <= pODMRenderParams->shading_dist_mist << 16 ) 1117 if ( v20 >= 0x40000 && v20 <= pODMRenderParams->shading_dist_mist << 16 )
1131 { 1118 {
1132 a5 = (unsigned __int64)(v42 * (signed __int64)pGame->pIndoorCameraD3D->int_sine_y) >> 16; 1119 a5 = fixpoint_mul(v42, pGame->pIndoorCameraD3D->int_sine_y);
1133 b = (unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_y) >> 16; 1120 b = fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_cosine_y);
1134 v21 = ((unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_y) >> 16) - a5; 1121 v21 = fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_cosine_y) - a5;
1135 v41 = ((unsigned __int64)(v40 * (signed __int64)pGame->pIndoorCameraD3D->int_cosine_y) >> 16) - a5; 1122 v41 = fixpoint_mul(v40, pGame->pIndoorCameraD3D->int_cosine_y) - a5;
1136 v22 = (decor->vPosition.z - pGame->pIndoorCameraD3D->vPartyPos.z) << 16; 1123 v22 = (decor->vPosition.z - pGame->pIndoorCameraD3D->vPartyPos.z) << 16;
1137 goto LABEL_30; 1124 goto LABEL_30;
1138 } 1125 }
1139 } 1126 }
1140 } 1127 }
4957 4944
4958 int _507D30_idx = 0; 4945 int _507D30_idx = 0;
4959 for ( _507D30_idx; _507D30_idx < pSkyPolygon.uNumVertices; _507D30_idx++ ) 4946 for ( _507D30_idx; _507D30_idx < pSkyPolygon.uNumVertices; _507D30_idx++ )
4960 { 4947 {
4961 //v15 = (void *)(v72 * (v70 - (int)array_507D30[_507D30_idx].vWorldViewProjY)); 4948 //v15 = (void *)(v72 * (v70 - (int)array_507D30[_507D30_idx].vWorldViewProjY));
4962 v77 = (unsigned __int64)(pSkyPolygon.ptr_38->viewing_angle_from_west_east * (signed __int64)(v72 * (v70 - array_507D30[_507D30_idx].vWorldViewProjY))) >> 16; 4949 v77 = fixpoint_mul(pSkyPolygon.ptr_38->viewing_angle_from_west_east, v72 * (v70 - array_507D30[_507D30_idx].vWorldViewProjY));
4963 v74 = v77 + pSkyPolygon.ptr_38->angle_from_north; 4950 v74 = v77 + pSkyPolygon.ptr_38->angle_from_north;
4964 4951
4965 v77 = (unsigned __int64)(pSkyPolygon.ptr_38->viewing_angle_from_north_south * (signed __int64)(v72 * (v70 - array_507D30[_507D30_idx].vWorldViewProjY))) >> 16; 4952 v77 = fixpoint_mul(pSkyPolygon.ptr_38->viewing_angle_from_north_south, v72 * (v70 - array_507D30[_507D30_idx].vWorldViewProjY));
4966 v74_ = v77 + pSkyPolygon.ptr_38->angle_from_east; 4953 v74_ = v77 + pSkyPolygon.ptr_38->angle_from_east;
4967 4954
4968 v79 = (void *)(((unsigned __int64)(pSkyPolygon.v_18.z * (signed __int64)v72 * (v70 - (int)array_507D30[_507D30_idx].vWorldViewProjY))) >> 16); 4955 v79 = (void *)(fixpoint_mul(pSkyPolygon.v_18.z, v72 * (v70 - (int)array_507D30[_507D30_idx].vWorldViewProjY)));
4969 v17 = v72 * (pBLVRenderParams->uViewportCenterX - (int)array_507D30[_507D30_idx].vWorldViewProjX); 4956 v17 = v72 * (pBLVRenderParams->uViewportCenterX - (int)array_507D30[_507D30_idx].vWorldViewProjX);
4970 v18 = array_507D30[_507D30_idx].vWorldViewProjY - 1.0; 4957 v18 = array_507D30[_507D30_idx].vWorldViewProjY - 1.0;
4971 v19 = -pSkyPolygon.field_24; 4958 v19 = -pSkyPolygon.field_24;
4972 v77 = -pSkyPolygon.field_24; 4959 v77 = -pSkyPolygon.field_24;
4973 X = (int)((char *)v79 + pSkyPolygon.v_18.x); 4960 X = (int)((char *)v79 + pSkyPolygon.v_18.x);
4984 if ( SLODWORD(v76) <= (signed int)pViewport->uViewportTL_Y ) 4971 if ( SLODWORD(v76) <= (signed int)pViewport->uViewportTL_Y )
4985 break; 4972 break;
4986 v19 = v77; 4973 v19 = v77;
4987 v20 = v79; 4974 v20 = v79;
4988 LABEL_14: 4975 LABEL_14:
4989 v79 = (void *)((unsigned __int64)(pSkyPolygon.v_18.z * (signed __int64)(signed int)v20) >> 16); 4976 v79 = (void *)fixpoint_mul(pSkyPolygon.v_18.z, (int)v20);
4990 v22 = (unsigned __int64)(pSkyPolygon.v_18.z * (signed __int64)(signed int)v20) >> 16; 4977 v22 = fixpoint_mul(pSkyPolygon.v_18.z, (int)v20);
4991 --LODWORD(v76); 4978 --LODWORD(v76);
4992 v20 = (char *)v20 + v72; 4979 v20 = (char *)v20 + v72;
4993 X = v22 + pSkyPolygon.v_18.x; 4980 X = v22 + pSkyPolygon.v_18.x;
4994 v78 = 1; 4981 v78 = 1;
4995 } 4982 }
4997 { 4984 {
4998 LODWORD(v23) = v77 << 16; 4985 LODWORD(v23) = v77 << 16;
4999 HIDWORD(v23) = v77 >> 16;//v23 = 0xfffffe0000000000 4986 HIDWORD(v23) = v77 >> 16;//v23 = 0xfffffe0000000000
5000 v79 = (void *)(v23 / X);//X = FFFF9014(-28652) 4987 v79 = (void *)(v23 / X);//X = FFFF9014(-28652)
5001 v77 = v17; 4988 v77 = v17;
5002 signed __int64 s = v74 + ((pSkyPolygon.ptr_38->angle_from_west * (signed __int64)v17) >> 16);// s = 0xFFFFFFFF FFFF3EE6 4989 signed __int64 s = v74 + fixpoint_mul(pSkyPolygon.ptr_38->angle_from_west, v17);// s = 0xFFFFFFFF FFFF3EE6
5003 LODWORD(v80) = v66 + ((signed int)((unsigned __int64)(SLODWORD(s) * (v23 / X)) >> 16) >> 4); 4990 LODWORD(v80) = v66 + ((signed int)fixpoint_mul(SLODWORD(s), v23 / X) >> 4);
5004 array_507D30[_507D30_idx].u = ((double)SLODWORD(v80) * 0.000015259022) * (1.0 / (double)pSkyPolygon.pTexture->uTextureWidth); 4991 array_507D30[_507D30_idx].u = ((double)SLODWORD(v80) * 0.000015259022) * (1.0 / (double)pSkyPolygon.pTexture->uTextureWidth);
5005 4992
5006 signed __int64 s2 = (signed __int64)(v74_ + ((unsigned __int64)(pSkyPolygon.ptr_38->angle_from_south * (signed __int64)v17) >> 16)); 4993 signed __int64 s2 = v74_ + fixpoint_mul(pSkyPolygon.ptr_38->angle_from_south, v17);
5007 LODWORD(v80) = v63 + ((signed int)((unsigned __int64)(SLODWORD(s2) * (v23 / X)) >> 16) >> 4); 4994 LODWORD(v80) = v63 + ((signed int)fixpoint_mul(SLODWORD(s2), v23 / X) >> 4);
5008 array_507D30[_507D30_idx].v = ((double)SLODWORD(v80) * 0.000015259022) * v68; 4995 array_507D30[_507D30_idx].v = ((double)SLODWORD(v80) * 0.000015259022) * v68;
5009 4996
5010 v77 = (unsigned __int64)(SLODWORD(s) * (v23 / X)) >> 16; 4997 v77 = fixpoint_mul(SLODWORD(s), v23 / X);
5011 LODWORD(v73) = (unsigned __int64)(SLODWORD(s2) * (v23 / X)) >> 16; 4998 LODWORD(v73) = fixpoint_mul(SLODWORD(s2), v23 / X);
5012 array_507D30[_507D30_idx]._rhw = 65536.0 / (double)(signed int)v79; 4999 array_507D30[_507D30_idx]._rhw = 65536.0 / (double)(signed int)v79;
5013 5000
5014 //if ( (int)v81 >= pSkyPolygon.uNumVertices ) 5001 //if ( (int)v81 >= pSkyPolygon.uNumVertices )
5015 //{ 5002 //{
5016 // pRenderer->DrawIndoorSkyPolygon(pSkyPolygon.uNumVertices, &pSkyPolygon, 5003 // pRenderer->DrawIndoorSkyPolygon(pSkyPolygon.uNumVertices, &pSkyPolygon,
5071 for ( int t = (int)LODWORD(v73); t > 1; t-- ) 5058 for ( int t = (int)LODWORD(v73); t > 1; t-- )
5072 { 5059 {
5073 v35 = (const void *)(v72 * (v70 - (unsigned __int64)(signed __int64)array_50AC10[j].vWorldViewProjY)); 5060 v35 = (const void *)(v72 * (v70 - (unsigned __int64)(signed __int64)array_50AC10[j].vWorldViewProjY));
5074 5061
5075 //v78 = pSkyPolygon.ptr_38->viewing_angle_from_west_east; 5062 //v78 = pSkyPolygon.ptr_38->viewing_angle_from_west_east;
5076 v81 = (const void *)((unsigned __int64)(pSkyPolygon.ptr_38->viewing_angle_from_west_east * (signed __int64)(signed int)v35) >> 16); 5063 //v81 = (const void *)fixpoint_mul(pSkyPolygon.ptr_38->viewing_angle_from_west_east, v35);
5077 v36 = (int)((char *)v81 + pSkyPolygon.ptr_38->angle_from_north); 5064 v36 = (int)(fixpoint_mul(pSkyPolygon.ptr_38->viewing_angle_from_west_east, (int)v35) + pSkyPolygon.ptr_38->angle_from_north);
5078 5065
5079 v81 = v35; 5066 v81 = v35;
5080 v74 = v36; 5067 v74 = v36;
5081 //v78 = pSkyPolygon.ptr_38->viewing_angle_from_north_south; 5068 //v78 = pSkyPolygon.ptr_38->viewing_angle_from_north_south;
5082 v81 = (const void *)((unsigned __int64)(pSkyPolygon.ptr_38->viewing_angle_from_north_south * (signed __int64)(signed int)v35) >> 16); 5069 v81 = (const void *)fixpoint_mul(pSkyPolygon.ptr_38->viewing_angle_from_north_south, (int)v35);
5083 v78 = (int)v35; 5070 v78 = (int)v35;
5084 v75 = (RenderVertexSoft *)((char *)v81 + pSkyPolygon.ptr_38->angle_from_east); 5071 v75 = (RenderVertexSoft *)((char *)v81 + pSkyPolygon.ptr_38->angle_from_east);
5085 v81 = (const void *)pSkyPolygon.v_18.z; 5072 //v81 = (const void *)pSkyPolygon.v_18.z;
5086 v78 = (unsigned __int64)(pSkyPolygon.v_18.z * (signed __int64)(signed int)v35) >> 16; 5073 v78 = fixpoint_mul(pSkyPolygon.v_18.z, (int)v35);
5087 v37 = (const void *)(v72 5074 v37 = (const void *)(v72 * (pBLVRenderParams->uViewportCenterX - (unsigned __int64)(signed __int64)array_50AC10[j].vWorldViewProjX));
5088 * (pBLVRenderParams->uViewportCenterX - (unsigned __int64)(signed __int64)array_50AC10[j].vWorldViewProjX));
5089 v38 = (signed __int64)(array_50AC10[j].vWorldViewProjY - 1.0); 5075 v38 = (signed __int64)(array_50AC10[j].vWorldViewProjY - 1.0);
5090 v81 = 0; 5076 v81 = 0;
5091 LODWORD(v76) = v38; 5077 LODWORD(v76) = v38;
5092 v39 = v72 * (v70 - v38); 5078 v39 = v72 * (v70 - v38);
5093 while ( 1 ) 5079 while ( 1 )
5101 if ( SLODWORD(v76) <= (signed int)pViewport->uViewportTL_Y ) 5087 if ( SLODWORD(v76) <= (signed int)pViewport->uViewportTL_Y )
5102 break; 5088 break;
5103 v39 = v78; 5089 v39 = v78;
5104 LABEL_36: 5090 LABEL_36:
5105 v78 = pSkyPolygon.v_18.z; 5091 v78 = pSkyPolygon.v_18.z;
5106 v41 = (unsigned __int64)(pSkyPolygon.v_18.z * (signed __int64)v39) >> 16; 5092 v41 = fixpoint_mul(pSkyPolygon.v_18.z, v39);
5107 --LODWORD(v76); 5093 --LODWORD(v76);
5108 v39 += v72; 5094 v39 += v72;
5109 X = v41 + pSkyPolygon.v_18.x; 5095 X = v41 + pSkyPolygon.v_18.x;
5110 v81 = (const void *)1; 5096 v81 = (const void *)1;
5111 } 5097 }
5112 if ( v81 ) 5098 if ( v81 )
5113 { 5099 {
5114 v79 = (void *)pSkyPolygon.v_18.z; 5100 v79 = (void *)pSkyPolygon.v_18.z;
5115 v78 = 2 * LODWORD(v76); 5101 v78 = 2 * LODWORD(v76);
5116 v81 = (const void *)((unsigned __int64)(pSkyPolygon.v_18.z 5102 v81 = (const void *)fixpoint_mul(pSkyPolygon.v_18.z, (((double)v70 - ((double)(2 * LODWORD(v76)) - array_50AC10[j].vWorldViewProjY))
5117 * (signed __int64)(signed int)(signed __int64)(((double)v70 5103 * (double)v72));
5118 - ((double)(2 * LODWORD(v76))
5119 - array_50AC10[j].vWorldViewProjY))
5120 * (double)v72)) >> 16);
5121 X = (int)((char *)v81 + pSkyPolygon.v_18.x); 5104 X = (int)((char *)v81 + pSkyPolygon.v_18.x);
5122 } 5105 }
5123 LODWORD(v42) = v77 << 16; 5106 LODWORD(v42) = v77 << 16;
5124 HIDWORD(v42) = v77 >> 16; 5107 HIDWORD(v42) = v77 >> 16;
5125 v79 = (void *)(v42 / X); 5108 v79 = (void *)(v42 / X);
5126 v81 = v37; 5109 v81 = v37;
5127 5110
5128 //v78 = pSkyPolygon.ptr_38->angle_from_west; 5111 //v78 = pSkyPolygon.ptr_38->angle_from_west;
5129 v81 = (const void *)((unsigned __int64)(pSkyPolygon.ptr_38->angle_from_west * (signed __int64)(signed int)v37) >> 16); 5112 v81 = (const void *)fixpoint_mul(pSkyPolygon.ptr_38->angle_from_west, (int)v37);
5130 v43 = v74 + ((unsigned __int64)(pSkyPolygon.ptr_38->angle_from_west * (signed __int64)(signed int)v37) >> 16); 5113 v43 = v74 + fixpoint_mul(pSkyPolygon.ptr_38->angle_from_west, (int)v37);
5131 v74 = (unsigned int)v37; 5114 v74 = (unsigned int)v37;
5132 LODWORD(v76) = v43; 5115 LODWORD(v76) = v43;
5133 5116
5134 //v78 = pSkyPolygon.ptr_38->angle_from_south; 5117 //v78 = pSkyPolygon.ptr_38->angle_from_south;
5135 v75 = (RenderVertexSoft *)((char *)v75 + ((unsigned __int64)(pSkyPolygon.ptr_38->angle_from_south * (signed __int64)(signed int)v37) >> 16)); 5118 v75 = (RenderVertexSoft *)((char *)v75 + fixpoint_mul(pSkyPolygon.ptr_38->angle_from_south, (int)v37));
5136 v74 = (unsigned __int64)(v43 * v42 / X) >> 16; 5119 //v74 = fixpoint_mul(v43, v42 / X);
5137 v81 = (const void *)((unsigned __int64)((signed int)v75 * v42 / X) >> 16); 5120 v81 = (const void *)fixpoint_mul((int)v75, v42 / X);
5138 5121
5139 //v34 += 48; 5122 //v34 += 48;
5140 v78 = v66 + ((signed int)v74 >> 4); 5123 //v78 = v66 + ((signed int)fixpoint_mul(v43, v42 / X) >> 4);
5141 //v44 = HIDWORD(v69)-- == 1; 5124 //v44 = HIDWORD(v69)-- == 1;
5142 v45 = (double)v78 * 0.000015259022; 5125 //v45 = (double)(v66 + ((signed int)fixpoint_mul(v43, v42 / X) >> 4)) * 0.000015259022;
5143 v78 = v63 + ((signed int)((unsigned __int64)((signed int)v75 * v42 / X) >> 16) >> 4); 5126 //v78 = v63 + ((signed int)fixpoint_mul((int)v75, v42 / X) >> 4);
5144 array_50AC10[j].u = v45 * (1.0 / (double)pSkyPolygon.pTexture->uTextureWidth); 5127 array_50AC10[j].u = ((double)(v66 + ((signed int)fixpoint_mul(v43, v42 / X) >> 4)) * 0.000015259022) * (1.0 / (double)pSkyPolygon.pTexture->uTextureWidth);
5145 array_50AC10[j].v = (double)v78 * 0.000015259022 * v68; 5128 array_50AC10[j].v = ((double)(v66 + ((signed int)fixpoint_mul(v43, v42 / X) >> 4)) * 0.000015259022) * v68;
5146 //v46 = (double)(signed int)v79; 5129 //v46 = (double)(signed int)v79;
5147 array_50AC10[j].vWorldViewPosition.x = 0.000015258789 * (double)(signed int)v79; 5130 array_50AC10[j].vWorldViewPosition.x = 0.000015258789 * (double)(signed int)v79;
5148 array_50AC10[j]._rhw = 65536.0 / (double)(signed int)v79; 5131 array_50AC10[j]._rhw = 65536.0 / (double)(signed int)v79;
5149 ++j; 5132 ++j;
5150 } 5133 }
8747 if ( v53 == pOutdoor->pBModels[model_id].pFaces[face_id].uNumVertices ) 8730 if ( v53 == pOutdoor->pBModels[model_id].pFaces[face_id].uNumVertices )
8748 LOBYTE(array_77EC08[pODMRenderParams->uNumPolygons].field_32) |= 1; 8731 LOBYTE(array_77EC08[pODMRenderParams->uNumPolygons].field_32) |= 1;
8749 array_77EC08[pODMRenderParams->uNumPolygons].pODMFace = &pOutdoor->pBModels[model_id].pFaces[face_id]; 8732 array_77EC08[pODMRenderParams->uNumPolygons].pODMFace = &pOutdoor->pBModels[model_id].pFaces[face_id];
8750 array_77EC08[pODMRenderParams->uNumPolygons].uNumVertices = pOutdoor->pBModels[model_id].pFaces[face_id].uNumVertices; 8733 array_77EC08[pODMRenderParams->uNumPolygons].uNumVertices = pOutdoor->pBModels[model_id].pFaces[face_id].uNumVertices;
8751 array_77EC08[pODMRenderParams->uNumPolygons].field_59 = 5; 8734 array_77EC08[pODMRenderParams->uNumPolygons].field_59 = 5;
8752 v51 = (unsigned __int64)(-pOutdoor->vSunlight.x * (signed __int64)pOutdoor->pBModels[model_id].pFaces[face_id].pFacePlane.vNormal.x) >> 16; 8735 v51 = fixpoint_mul(-pOutdoor->vSunlight.x, pOutdoor->pBModels[model_id].pFaces[face_id].pFacePlane.vNormal.x);
8753 v53 = (unsigned __int64)(-pOutdoor->vSunlight.y * (signed __int64)pOutdoor->pBModels[model_id].pFaces[face_id].pFacePlane.vNormal.y) >> 16; 8736 v53 = fixpoint_mul(-pOutdoor->vSunlight.y, pOutdoor->pBModels[model_id].pFaces[face_id].pFacePlane.vNormal.y);
8754 v52 = (unsigned __int64)(-pOutdoor->vSunlight.z * (signed __int64)pOutdoor->pBModels[model_id].pFaces[face_id].pFacePlane.vNormal.z) >> 16; 8737 v52 = fixpoint_mul(-pOutdoor->vSunlight.z, pOutdoor->pBModels[model_id].pFaces[face_id].pFacePlane.vNormal.z);
8755 array_77EC08[pODMRenderParams->uNumPolygons].dimming_level = 20 - (20 * (signed int)(v51 + v53 + v52) >> 16); 8738 array_77EC08[pODMRenderParams->uNumPolygons].dimming_level = 20 - fixpoint_mul(20, v51 + v53 + v52);
8756 if ( array_77EC08[pODMRenderParams->uNumPolygons].dimming_level < 0 ) 8739 if ( array_77EC08[pODMRenderParams->uNumPolygons].dimming_level < 0 )
8757 array_77EC08[pODMRenderParams->uNumPolygons].dimming_level = 0; 8740 array_77EC08[pODMRenderParams->uNumPolygons].dimming_level = 0;
8758 if ( array_77EC08[pODMRenderParams->uNumPolygons].dimming_level > 31 ) 8741 if ( array_77EC08[pODMRenderParams->uNumPolygons].dimming_level > 31 )
8759 array_77EC08[pODMRenderParams->uNumPolygons].dimming_level = 31; 8742 array_77EC08[pODMRenderParams->uNumPolygons].dimming_level = 31;
8760 if ( pODMRenderParams->uNumPolygons >= 1999 + 5000) 8743 if ( pODMRenderParams->uNumPolygons >= 1999 + 5000)
8913 //rotate skydome(вращение купола неба)-------------------------------------- 8896 //rotate skydome(вращение купола неба)--------------------------------------
8914 // В игре принята своя система измерения углов. Полный угол (180). Значению угла 0 соответствует 8897 // В игре принята своя система измерения углов. Полный угол (180). Значению угла 0 соответствует
8915 // направление на север и/или юг (либо на восток и/или запад), значению 65536 еденицам(0х10000) соответствует угол 90. 8898 // направление на север и/или юг (либо на восток и/или запад), значению 65536 еденицам(0х10000) соответствует угол 90.
8916 // две переменные хранят данные по углу обзора. field_14 по западу и востоку. field_20 по югу и северу 8899 // две переменные хранят данные по углу обзора. field_14 по западу и востоку. field_20 по югу и северу
8917 // от -25080 до 25080 8900 // от -25080 до 25080
8918 v39 = (unsigned __int64)(pSkyPolygon.ptr_38->viewing_angle_from_west_east * (signed __int64)(v33 * (v30 - floor(array_50AC10[i].vWorldViewProjY + 0.5)))) >> 16; 8901 v39 = fixpoint_mul(pSkyPolygon.ptr_38->viewing_angle_from_west_east, v33 * (v30 - floor(array_50AC10[i].vWorldViewProjY + 0.5)));
8919 v35 = v39 + pSkyPolygon.ptr_38->angle_from_north; 8902 v35 = v39 + pSkyPolygon.ptr_38->angle_from_north;
8920 8903
8921 v39 = (unsigned __int64)(pSkyPolygon.ptr_38->viewing_angle_from_north_south * (signed __int64)(v33 * (v30 - floor(array_50AC10[i].vWorldViewProjY + 0.f)))) >> 16; 8904 v39 = fixpoint_mul(pSkyPolygon.ptr_38->viewing_angle_from_north_south, v33 * (v30 - floor(array_50AC10[i].vWorldViewProjY + 0.f)));
8922 v36 = v39 + pSkyPolygon.ptr_38->angle_from_east; 8905 v36 = v39 + pSkyPolygon.ptr_38->angle_from_east;
8923 8906
8924 v9 = (unsigned __int64)(pSkyPolygon.v_18.z * (signed __int64)(v33 * (v30 - floor(array_50AC10[i].vWorldViewProjY + 0.5)))) >> 16; 8907 v9 = fixpoint_mul(pSkyPolygon.v_18.z, v33 * (v30 - floor(array_50AC10[i].vWorldViewProjY + 0.5)));
8925 v10 = pSkyPolygon.v_18.x + v9; 8908 v10 = pSkyPolygon.v_18.x + v9;
8926 if ( v10 > 0 ) 8909 if ( v10 > 0 )
8927 v10 = 0; 8910 v10 = 0;
8928 v13 = v33 * (pViewport->uScreenCenterX - (signed __int64)array_50AC10[i].vWorldViewProjX); 8911 v13 = v33 * (pViewport->uScreenCenterX - (signed __int64)array_50AC10[i].vWorldViewProjX);
8929 v34 = -pSkyPolygon.field_24; 8912 v34 = -pSkyPolygon.field_24;
8939 { 8922 {
8940 if ( v10 <= 0 ) 8923 if ( v10 <= 0 )
8941 break; 8924 break;
8942 } 8925 }
8943 } 8926 }
8944 v16 = (unsigned __int64)(pSkyPolygon.v_18.z * (signed __int64)v14) >> 16; 8927 v16 = fixpoint_mul(pSkyPolygon.v_18.z, v14);
8945 --v32; 8928 --v32;
8946 v14 += v33; 8929 v14 += v33;
8947 v10 = pSkyPolygon.v_18.x + v16; 8930 v10 = pSkyPolygon.v_18.x + v16;
8948 } 8931 }
8949 LODWORD(v17) = LODWORD(v34) << 16; 8932 LODWORD(v17) = LODWORD(v34) << 16;
8950 HIDWORD(v17) = v34 >> 16; 8933 HIDWORD(v17) = v34 >> 16;
8951 v18 = v17 / v10; 8934 v18 = v17 / v10;
8952 if ( v18 < 0 ) 8935 if ( v18 < 0 )
8953 v18 = pODMRenderParams->shading_dist_mist; 8936 v18 = pODMRenderParams->shading_dist_mist;
8954 v37 = v35 + ((unsigned __int64)(pSkyPolygon.ptr_38->angle_from_west * (signed __int64)v13) >> 16); 8937 v37 = v35 + fixpoint_mul(pSkyPolygon.ptr_38->angle_from_west, v13);
8955 v35 = 224 * pMiscTimer->uTotalGameTimeElapsed 8938 v35 = 224 * pMiscTimer->uTotalGameTimeElapsed + ((signed int)fixpoint_mul(v37, v18) >> 3);
8956 + ((signed int)((unsigned __int64)(v37 * (signed __int64)v18) >> 16) >> 3);
8957 array_50AC10[i].u = (double)v35 / ((double)pSkyPolygon.pTexture->uTextureWidth * 65536.0); 8939 array_50AC10[i].u = (double)v35 / ((double)pSkyPolygon.pTexture->uTextureWidth * 65536.0);
8958 8940
8959 v36 = v36 + ((unsigned __int64)(pSkyPolygon.ptr_38->angle_from_south * (signed __int64)v13) >> 16); 8941 v36 = v36 + fixpoint_mul(pSkyPolygon.ptr_38->angle_from_south, v13);
8960 v35 = 224 * pMiscTimer->uTotalGameTimeElapsed 8942 v35 = 224 * pMiscTimer->uTotalGameTimeElapsed + ((signed int)fixpoint_mul(v36, v18) >> 3);
8961 + ((signed int)((unsigned __int64)(v36 * (signed __int64)v18) >> 16) >> 3);
8962 array_50AC10[i].v = (double)v35 / ((double)pSkyPolygon.pTexture->uTextureHeight * 65536.0); 8943 array_50AC10[i].v = (double)v35 / ((double)pSkyPolygon.pTexture->uTextureHeight * 65536.0);
8963 8944
8964 array_50AC10[i].vWorldViewPosition.x = (double)0x2000;//pODMRenderParams->shading_dist_mist 8192 8945 array_50AC10[i].vWorldViewPosition.x = (double)0x2000;//pODMRenderParams->shading_dist_mist 8192
8965 array_50AC10[i]._rhw = 1.0 / (double)(v18 >> 16); 8946 array_50AC10[i]._rhw = 1.0 / (double)(v18 >> 16);
8966 } 8947 }
9037 for (uint y = 0; y < height; ++y) 9018 for (uint y = 0; y < height; ++y)
9038 { 9019 {
9039 for (uint x = 0; x < width; ++x) 9020 for (uint x = 0; x < width; ++x)
9040 { 9021 {
9041 //*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)]; 9022 //*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)];
9023 /*
9024 if (ddpfPrimarySuface.dwRGBBitCount == 32)
9025 {
9026 auto p = (unsigned __int32 *)pRenderer->pTargetSurface + (int)(x * interval_x + 8.0) + (int)(y * interval_y + 8.0) * pRenderer->uTargetSurfacePitch;
9027 *v3 = Color16((*p >> 16) & 255, (*p >> 8) & 255, *p & 255);
9028 }
9029 else if (ddpfPrimarySuface.dwRGBBitCount == 16)
9030 {
9031 auto p = (unsigned __int16 *)pRenderer->pTargetSurface + (int)(x * interval_x + 8.0) + (int)(y * interval_y + 8.0) * pRenderer->uTargetSurfacePitch;
9032 *v3 = *p;
9033 }
9034 */
9035 pRenderer->pTargetSurface;
9042 if (Dst.ddpfPixelFormat.dwRGBBitCount == 32) 9036 if (Dst.ddpfPixelFormat.dwRGBBitCount == 32)
9043 { 9037 {
9044 auto p = (unsigned __int32 *)Dst.lpSurface + (int)(x * interval_x + 8.0) + y/* (int)(y * interval_y + 8.0)*/ * Dst.lPitch; 9038 auto p = (unsigned __int32 *)Dst.lpSurface + (int)(x * interval_x + 8.0) + y/* (int)(y * interval_y + 8.0)*/ * Dst.lPitch;
9045 *v3 = Color16((*p >> 16) & 255, (*p >> 8) & 255, *p & 255); 9039 *v3 = Color16((*p >> 16) & 255, (*p >> 8) & 255, *p & 255);
9046 } 9040 }