Fix crash in viewer (#5446)
parent
c08e3b4abb
commit
f956351942
|
@ -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.
|
||||||
|
@ -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()
|
||||||
|
|
Loading…
Reference in New Issue