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 {