Mercurial > mm7
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 } |