Fix crash in viewer (#5446)

kimkulling/fix_static_code_analysis_findings
Kim Kulling 2024-01-30 22:14:18 +01:00 committed by GitHub
parent c08e3b4abb
commit f956351942
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 30 additions and 43 deletions

View File

@ -518,20 +518,19 @@ int CDisplay::AddTextureToDisplayList(unsigned int iType,
return 1; return 1;
} }
//------------------------------------------------------------------------------- //-------------------------------------------------------------------------------
int CDisplay::AddMaterialToDisplayList(HTREEITEM hRoot, int CDisplay::AddMaterialToDisplayList(HTREEITEM hRoot, unsigned int iIndex) {
unsigned int iIndex)
{
ai_assert(nullptr != hRoot); ai_assert(nullptr != hRoot);
aiMaterial* pcMat = g_pcAsset->pcScene->mMaterials[iIndex]; aiMaterial* pcMat = g_pcAsset->pcScene->mMaterials[iIndex];
if (g_pcAsset->pcScene->mNumMeshes == 0) {
return -1;
}
// find the first mesh using this material index // find the first mesh using this material index
unsigned int iMesh = 0; unsigned int iMesh = 0;
for (unsigned int i = 0; i < g_pcAsset->pcScene->mNumMeshes;++i) for (unsigned int i = 0; i < g_pcAsset->pcScene->mNumMeshes;++i) {
{ if (iIndex == g_pcAsset->pcScene->mMeshes[i]->mMaterialIndex) {
if (iIndex == g_pcAsset->pcScene->mMeshes[i]->mMaterialIndex)
{
iMesh = i; iMesh = i;
break; break;
} }
@ -540,12 +539,9 @@ int CDisplay::AddMaterialToDisplayList(HTREEITEM hRoot,
// use the name of the material, if possible // use the name of the material, if possible
char chTemp[512]; char chTemp[512];
aiString szOut; aiString szOut;
if (AI_SUCCESS != aiGetMaterialString(pcMat,AI_MATKEY_NAME,&szOut)) if (AI_SUCCESS != aiGetMaterialString(pcMat,AI_MATKEY_NAME,&szOut)) {
{
ai_snprintf(chTemp,512,"Material %i",iIndex+1); ai_snprintf(chTemp,512,"Material %i",iIndex+1);
} } else {
else
{
ai_snprintf(chTemp,512,"%s (%i)",szOut.data,iIndex+1); ai_snprintf(chTemp,512,"%s (%i)",szOut.data,iIndex+1);
} }
TVITEMEXW tvi; TVITEMEXW tvi;
@ -577,17 +573,15 @@ int CDisplay::AddMaterialToDisplayList(HTREEITEM hRoot,
aiTextureOp eOp; aiTextureOp eOp;
aiString szPath; aiString szPath;
bool bNoOpacity = true; bool bNoOpacity = true;
for (unsigned int i = 0; i <= AI_TEXTURE_TYPE_MAX;++i) for (unsigned int i = 0; i <= AI_TEXTURE_TYPE_MAX;++i) {
{
unsigned int iNum = 0; unsigned int iNum = 0;
while (true) while (true) {
{ if (AI_SUCCESS != aiGetMaterialTexture(pcMat,(aiTextureType)i,iNum, &szPath,nullptr, &iUV,&fBlend,&eOp)) {
if (AI_SUCCESS != aiGetMaterialTexture(pcMat,(aiTextureType)i,iNum,
&szPath,nullptr, &iUV,&fBlend,&eOp))
{
break; break;
} }
if (aiTextureType_OPACITY == i)bNoOpacity = false; if (aiTextureType_OPACITY == i) {
bNoOpacity = false;
}
AddTextureToDisplayList(i,iNum,&szPath,hTexture,iUV,fBlend,eOp,iMesh); AddTextureToDisplayList(i,iNum,&szPath,hTexture,iUV,fBlend,eOp,iMesh);
++iNum; ++iNum;
} }
@ -595,8 +589,7 @@ int CDisplay::AddMaterialToDisplayList(HTREEITEM hRoot,
AssetHelper::MeshHelper* pcMesh = g_pcAsset->apcMeshes[iMesh]; AssetHelper::MeshHelper* pcMesh = g_pcAsset->apcMeshes[iMesh];
if (pcMesh->piDiffuseTexture && pcMesh->piDiffuseTexture == pcMesh->piOpacityTexture && bNoOpacity) if (pcMesh->piDiffuseTexture && pcMesh->piDiffuseTexture == pcMesh->piOpacityTexture && bNoOpacity) {
{
// check whether the diffuse texture is not a default texture // check whether the diffuse texture is not a default texture
// {9785DA94-1D96-426b-B3CB-BADC36347F5E} // {9785DA94-1D96-426b-B3CB-BADC36347F5E}
@ -606,9 +599,7 @@ int CDisplay::AddMaterialToDisplayList(HTREEITEM hRoot,
uint32_t iData = 0; uint32_t iData = 0;
DWORD dwSize = 4; DWORD dwSize = 4;
if(FAILED( pcMesh->piDiffuseTexture->GetPrivateData(guidPrivateData,&iData,&dwSize) || if(FAILED( pcMesh->piDiffuseTexture->GetPrivateData(guidPrivateData,&iData,&dwSize) || 0xffffffff == iData)) {
0xffffffff == iData))
{
// seems the diffuse texture contains alpha, therefore it has been // seems the diffuse texture contains alpha, therefore it has been
// added to the opacity channel, too. Add a special value ... // added to the opacity channel, too. Add a special value ...
AddTextureToDisplayList(aiTextureType_OPACITY | 0x40000000, AddTextureToDisplayList(aiTextureType_OPACITY | 0x40000000,
@ -625,33 +616,26 @@ int CDisplay::AddMaterialToDisplayList(HTREEITEM hRoot,
this->AddMaterial(info); this->AddMaterial(info);
return 1; return 1;
} }
//------------------------------------------------------------------------------- //-------------------------------------------------------------------------------
// Expand all elements in the tree-view // Expand all elements in the tree-view
int CDisplay::ExpandTree() int CDisplay::ExpandTree() {
{
// expand all materials // expand all materials
for (std::vector< MaterialInfo >::iterator for (std::vector< MaterialInfo >::iterator i = m_asMaterials.begin(); i != m_asMaterials.end();++i) {
i = m_asMaterials.begin();
i != m_asMaterials.end();++i)
{
TreeView_Expand(GetDlgItem(g_hDlg,IDC_TREE1),(*i).hTreeItem,TVE_EXPAND); TreeView_Expand(GetDlgItem(g_hDlg,IDC_TREE1),(*i).hTreeItem,TVE_EXPAND);
} }
// expand all nodes // expand all nodes
for (std::vector< NodeInfo >::iterator for (std::vector< NodeInfo >::iterator i = m_asNodes.begin(); i != m_asNodes.end();++i) {
i = m_asNodes.begin();
i != m_asNodes.end();++i)
{
TreeView_Expand(GetDlgItem(g_hDlg,IDC_TREE1),(*i).hTreeItem,TVE_EXPAND); TreeView_Expand(GetDlgItem(g_hDlg,IDC_TREE1),(*i).hTreeItem,TVE_EXPAND);
} }
TreeView_Expand(GetDlgItem(g_hDlg,IDC_TREE1),m_hRoot,TVE_EXPAND); TreeView_Expand(GetDlgItem(g_hDlg,IDC_TREE1),m_hRoot,TVE_EXPAND);
return 1; return 1;
} }
//------------------------------------------------------------------------------- //-------------------------------------------------------------------------------
// Get image list for tree view // Get image list for tree view
int CDisplay::LoadImageList(void) int CDisplay::LoadImageList() {
{ if (!m_hImageList) {
if (!m_hImageList)
{
// First, create the image list we will need. // First, create the image list we will need.
// FIX: Need RGB888 color space to display all colors correctly // FIX: Need RGB888 color space to display all colors correctly
HIMAGELIST hIml = ImageList_Create( 16,16,ILC_COLOR24, 5, 0 ); HIMAGELIST hIml = ImageList_Create( 16,16,ILC_COLOR24, 5, 0 );
@ -682,12 +666,13 @@ int CDisplay::LoadImageList(void)
m_hImageList = hIml; m_hImageList = hIml;
} }
return 1; return 1;
} }
//------------------------------------------------------------------------------- //-------------------------------------------------------------------------------
// Fill tree view // Fill tree view
int CDisplay::FillDisplayList(void) int CDisplay::FillDisplayList(void) {
{
LoadImageList(); LoadImageList();
// Initialize the tree view window. // Initialize the tree view window.
@ -713,11 +698,11 @@ int CDisplay::FillDisplayList(void)
(LPARAM)(LPTVINSERTSTRUCT)&sNew); (LPARAM)(LPTVINSERTSTRUCT)&sNew);
// add each loaded material to the tree // add each loaded material to the tree
for (unsigned int i = 0; i < g_pcAsset->pcScene->mNumMaterials;++i) for (unsigned int i = 0; i < g_pcAsset->pcScene->mNumMaterials; ++i)
AddMaterialToDisplayList(m_hRoot,i); AddMaterialToDisplayList(m_hRoot,i);
// add each mesh to the tree // add each mesh to the tree
for (unsigned int i = 0; i < g_pcAsset->pcScene->mNumMeshes;++i) for (unsigned int i = 0; i < g_pcAsset->pcScene->mNumMeshes; ++i)
AddMeshToDisplayList(i,m_hRoot); AddMeshToDisplayList(i,m_hRoot);
// now add all loaded nodes recursively // now add all loaded nodes recursively
@ -729,8 +714,10 @@ int CDisplay::FillDisplayList(void)
// everything reacts a little bit slowly if D3D is rendering, // everything reacts a little bit slowly if D3D is rendering,
// so give GDI a small hint to leave the couch and work ;-) // so give GDI a small hint to leave the couch and work ;-)
UpdateWindow(g_hDlg); UpdateWindow(g_hDlg);
return 1; return 1;
} }
//------------------------------------------------------------------------------- //-------------------------------------------------------------------------------
// Main render loop // Main render loop
int CDisplay::OnRender() int CDisplay::OnRender()