Mercurial > mm7
comparison Render.cpp @ 1903:79ac2dbedfb9
ODM_NearClip and ODM_FarClip
author | Ritor1 |
---|---|
date | Mon, 21 Oct 2013 17:08:14 +0600 |
parents | 4359a15360e3 |
children | 1a1c4040bee4 |
comparison
equal
deleted
inserted
replaced
1902:39b6d789cbfc | 1903:79ac2dbedfb9 |
---|---|
8725 Log::Warning(L"SetBillboardBlendOptions: invalid opacity type (%u)", a1); | 8725 Log::Warning(L"SetBillboardBlendOptions: invalid opacity type (%u)", a1); |
8726 assert(false); | 8726 assert(false); |
8727 break; | 8727 break; |
8728 } | 8728 } |
8729 } | 8729 } |
8730 | 8730 //----- (00424CD7) -------------------------------------------------------- |
8731 int ODM_NearClip(unsigned int num_vertices) | |
8732 { | |
8733 bool current_vertices_flag; // edi@1 | |
8734 bool next_vertices_flag; // [sp+Ch] [bp-24h]@6 | |
8735 double t; // st6@10 | |
8736 int pNextVertices; | |
8737 | |
8738 if (!num_vertices) | |
8739 return 0; | |
8740 | |
8741 memcpy(&array_50AC10[num_vertices], array_50AC10, sizeof(array_50AC10[0])); | |
8742 current_vertices_flag = 0; | |
8743 if ( array_50AC10[0].vWorldViewPosition.x >= 8.0 ) | |
8744 current_vertices_flag = 1; | |
8745 | |
8746 int out_num_vertices = 0; | |
8747 for (int i = 0; i < num_vertices; ++i) | |
8748 { | |
8749 next_vertices_flag = array_50AC10[i + 1].vWorldViewPosition.x >= 8.0; | |
8750 if ( current_vertices_flag != next_vertices_flag ) | |
8751 { | |
8752 if ( next_vertices_flag ) | |
8753 { | |
8754 //t = neer_clip - v0.x / v1.x - v0.x (формула получения точки пересечения отрезка с плоскостью) | |
8755 t = (8.0 - array_50AC10[i].vWorldViewPosition.x) / (array_50AC10[i + 1].vWorldViewPosition.x - array_50AC10[i].vWorldViewPosition.x); | |
8756 array_507D30[out_num_vertices].vWorldViewPosition.y = (array_50AC10[i + 1].vWorldViewPosition.y - array_50AC10[i].vWorldViewPosition.y) * t + array_50AC10[i].vWorldViewPosition.y; | |
8757 array_507D30[out_num_vertices].vWorldViewPosition.z = (array_50AC10[i + 1].vWorldViewPosition.z - array_50AC10[i].vWorldViewPosition.z) * t + array_50AC10[i].vWorldViewPosition.z; | |
8758 array_507D30[out_num_vertices].u = (array_50AC10[i + 1].u - array_50AC10[i].u) * t + array_50AC10[i].u; | |
8759 array_507D30[out_num_vertices].v = (array_50AC10[i + 1].v - array_50AC10[i].v) * t + array_50AC10[i].v; | |
8760 } | |
8761 else | |
8762 { | |
8763 t = (8.0 - array_50AC10[i + 1].vWorldViewPosition.x) / (array_50AC10[i].vWorldViewPosition.x - array_50AC10[i + 1].vWorldViewPosition.x); | |
8764 array_507D30[out_num_vertices].vWorldViewPosition.y = (array_50AC10[i].vWorldViewPosition.y - array_50AC10[i + 1].vWorldViewPosition.y) * t + array_50AC10[i + 1].vWorldViewPosition.y; | |
8765 array_507D30[out_num_vertices].vWorldViewPosition.z = (array_50AC10[i].vWorldViewPosition.z - array_50AC10[i + 1].vWorldViewPosition.z) * t + array_50AC10[i + 1].vWorldViewPosition.z; | |
8766 array_507D30[out_num_vertices].u = (array_50AC10[i].u - array_50AC10[i + 1].u) * t + array_50AC10[i + 1].u; | |
8767 array_507D30[out_num_vertices].v = (array_50AC10[i].v - array_50AC10[i + 1].v) * t + array_50AC10[i + 1].v; | |
8768 } | |
8769 array_507D30[out_num_vertices].vWorldViewPosition.x = 8.0; | |
8770 array_507D30[out_num_vertices]._rhw = 1.0 / 8.0; | |
8771 ++out_num_vertices; | |
8772 } | |
8773 if ( next_vertices_flag ) | |
8774 { | |
8775 pNextVertices = out_num_vertices++; | |
8776 memcpy(&array_507D30[pNextVertices], &array_50AC10[i + 1], 0x30); | |
8777 } | |
8778 current_vertices_flag = next_vertices_flag; | |
8779 } | |
8780 return out_num_vertices >= 3 ? out_num_vertices : 0; | |
8781 } | |
8731 //----- (00424EE0) -------------------------------------------------------- | 8782 //----- (00424EE0) -------------------------------------------------------- |
8732 int BuildingVerticesClipping(unsigned int uNumVertices) | 8783 int ODM_FarClip(unsigned int uNumVertices) |
8733 { | 8784 { |
8734 signed int previous_vertices_flag; // edi@1 | 8785 signed int previous_vertices_flag; // edi@1 |
8735 double t; // st6@10 | 8786 double t; // st6@10 |
8736 bool current_vertices_flag; // [sp+Ch] [bp-28h]@6 | 8787 bool current_vertices_flag; // [sp+Ch] [bp-28h]@6 |
8737 signed int depth_num_vertices; // [sp+18h] [bp-1Ch]@1 | 8788 signed int depth_num_vertices; // [sp+18h] [bp-1Ch]@1 |
8958 } | 9009 } |
8959 if ( stru_F8AD28.uNumLightsApplied > 0 ) | 9010 if ( stru_F8AD28.uNumLightsApplied > 0 ) |
8960 pGame->pLightmapBuilder->ApplyLights(&stru_F8AD28, &static_RenderBuildingsD3D_stru_73C834, uNumVertices, array_50AC10, 0, (char)v31); | 9011 pGame->pLightmapBuilder->ApplyLights(&stru_F8AD28, &static_RenderBuildingsD3D_stru_73C834, uNumVertices, array_50AC10, 0, (char)v31); |
8961 if ( v50 ) | 9012 if ( v50 ) |
8962 { | 9013 { |
8963 array_77EC08[pODMRenderParams->uNumPolygons].uNumVertices = sr_424CD7(pOutdoor->pBModels[model_id].pFaces[face_id].uNumVertices); | 9014 array_77EC08[pODMRenderParams->uNumPolygons].uNumVertices = ODM_NearClip(pOutdoor->pBModels[model_id].pFaces[face_id].uNumVertices); |
8964 uNumVertices = array_77EC08[pODMRenderParams->uNumPolygons].uNumVertices; | 9015 uNumVertices = array_77EC08[pODMRenderParams->uNumPolygons].uNumVertices; |
8965 ODM_Project(array_77EC08[pODMRenderParams->uNumPolygons].uNumVertices); | 9016 ODM_Project(array_77EC08[pODMRenderParams->uNumPolygons].uNumVertices); |
8966 } | 9017 } |
8967 if ( v49 ) | 9018 if ( v49 ) |
8968 { | 9019 { |
8969 array_77EC08[pODMRenderParams->uNumPolygons].uNumVertices = BuildingVerticesClipping(pOutdoor->pBModels[model_id].pFaces[face_id].uNumVertices); | 9020 array_77EC08[pODMRenderParams->uNumPolygons].uNumVertices = ODM_FarClip(pOutdoor->pBModels[model_id].pFaces[face_id].uNumVertices); |
8970 uNumVertices = array_77EC08[pODMRenderParams->uNumPolygons].uNumVertices; | 9021 uNumVertices = array_77EC08[pODMRenderParams->uNumPolygons].uNumVertices; |
8971 ODM_Project(array_77EC08[pODMRenderParams->uNumPolygons].uNumVertices); | 9022 ODM_Project(array_77EC08[pODMRenderParams->uNumPolygons].uNumVertices); |
8972 } | 9023 } |
8973 if ( uNumVertices ) | 9024 if ( uNumVertices ) |
8974 { | 9025 { |