diff --git a/code/BlenderLoader.cpp b/code/BlenderLoader.cpp index 621c6455d..f0097ef73 100644 --- a/code/BlenderLoader.cpp +++ b/code/BlenderLoader.cpp @@ -554,7 +554,12 @@ void BlenderImporter::BuildMaterials(ConversionData& conv_data) // basic material colors aiColor3D col(mat->r,mat->g,mat->b); - mout->AddProperty(&col,1,AI_MATKEY_COLOR_DIFFUSE); + if (mat->r || mat->g || mat->b ) { + + // Usually, zero diffuse color means no diffuse color at all in the equation - seemingly. + // So we ommit this member to express this intent. + mout->AddProperty(&col,1,AI_MATKEY_COLOR_DIFFUSE); + } col = aiColor3D(mat->specr,mat->specg,mat->specb); mout->AddProperty(&col,1,AI_MATKEY_COLOR_SPECULAR); @@ -681,7 +686,10 @@ void BlenderImporter::ConvertMesh(const Scene& in, const Object* obj, const Mesh aiVector3D* vn = out->mNormals + out->mNumVertices; // XXX we can't fold this easily, because we are restricted - // to the member names from the BLEND file (v1,v2,v3,v4) .. + // to the member names from the BLEND file (v1,v2,v3,v4) + // which are assigned by the genblenddna.py script and + // cannot be changed without breaking the entire + // import process. if (mf.v1 >= mesh->totvert) { ThrowException("Vertex index v1 out of range"); diff --git a/tools/assimp_view/Display.cpp b/tools/assimp_view/Display.cpp index 098870e68..57993c28e 100644 --- a/tools/assimp_view/Display.cpp +++ b/tools/assimp_view/Display.cpp @@ -1778,9 +1778,14 @@ int CDisplay::RenderFullScene() if (NULL != g_pcAsset && NULL != g_pcAsset->pcScene->mRootNode) { // disable the z-buffer - g_piDevice->SetRenderState(D3DRS_ZWRITEENABLE,FALSE); + if (!g_sOptions.bNoAlphaBlending) { + g_piDevice->SetRenderState(D3DRS_ZWRITEENABLE,FALSE); + } RenderNode(g_pcAsset->pcScene->mRootNode,m,true); - g_piDevice->SetRenderState(D3DRS_ZWRITEENABLE,TRUE); + + if (!g_sOptions.bNoAlphaBlending) { + g_piDevice->SetRenderState(D3DRS_ZWRITEENABLE,TRUE); + } } // setup the stereo view if necessary @@ -2042,6 +2047,11 @@ int CDisplay::RenderNode (aiNode* piNode,const aiMatrix4x4& piMatrix, } g_piDevice->SetVertexDeclaration( gDefaultVertexDecl); + if (g_sOptions.bNoAlphaBlending) { + // manually disable alphablending + g_piDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE); + } + if (bAlpha)CMeshRenderer::Instance().DrawSorted(piNode->mMeshes[i],aiMe); else CMeshRenderer::Instance().DrawUnsorted(piNode->mMeshes[i]); @@ -2235,7 +2245,7 @@ int CDisplay::RenderTextureView() g_piPassThroughEffect->BeginPass(0); if (aiTextureType_HEIGHT == m_pcCurrentTexture->iType || - aiTextureType_NORMALS == m_pcCurrentTexture->iType) + aiTextureType_NORMALS == m_pcCurrentTexture->iType || g_sOptions.bNoAlphaBlending) { // manually disable alpha blending g_piDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE); diff --git a/tools/assimp_view/Material.cpp b/tools/assimp_view/Material.cpp index da90466af..f8299ea15 100644 --- a/tools/assimp_view/Material.cpp +++ b/tools/assimp_view/Material.cpp @@ -333,19 +333,20 @@ int CMaterialManager::LoadTexture(IDirect3DTexture9** p_ppiOut,aiString* szPath) { // it is an embedded file ... don't need the file format hint, // simply let D3DX load the file + D3DXIMAGE_INFO info; if (FAILED(D3DXCreateTextureFromFileInMemoryEx(g_piDevice, g_pcAsset->pcScene->mTextures[iIndex]->pcData, g_pcAsset->pcScene->mTextures[iIndex]->mWidth, D3DX_DEFAULT, D3DX_DEFAULT, - 0, + 1, D3DUSAGE_AUTOGENMIPMAP, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, - NULL, + &info, NULL, p_ppiOut))) { diff --git a/tools/assimp_view/MeshRenderer.cpp b/tools/assimp_view/MeshRenderer.cpp index c71274db8..864122709 100644 --- a/tools/assimp_view/MeshRenderer.cpp +++ b/tools/assimp_view/MeshRenderer.cpp @@ -88,11 +88,10 @@ int CMeshRenderer::DrawSorted(unsigned int iIndex,const aiMatrix4x4& mWorld) if (!pcHelper || !pcMesh || !pcHelper->piIB) return -5; - if (pcMesh->mPrimitiveTypes != aiPrimitiveType_TRIANGLE) - return DrawUnsorted(iIndex); - if (pcMesh->HasBones()) + if (pcMesh->mPrimitiveTypes != aiPrimitiveType_TRIANGLE || pcMesh->HasBones() || g_sOptions.bNoAlphaBlending) return DrawUnsorted(iIndex); + // compute the position of the camera in worldspace aiMatrix4x4 mWorldInverse = mWorld; mWorldInverse.Inverse(); diff --git a/tools/assimp_view/MessageProc.cpp b/tools/assimp_view/MessageProc.cpp index 5bd541c91..766dfbb4b 100644 --- a/tools/assimp_view/MessageProc.cpp +++ b/tools/assimp_view/MessageProc.cpp @@ -272,6 +272,19 @@ void ToggleLightRotate() RegSetValueExA(g_hRegistry,"LightRotate",0,REG_DWORD,(const BYTE*)&dwValue,4); } +//------------------------------------------------------------------------------- +// Toggle the "NoTransparency" state +//------------------------------------------------------------------------------- +void ToggleTransparency() +{ + g_sOptions.bNoAlphaBlending = !g_sOptions.bNoAlphaBlending; + + // store this in the registry, too + DWORD dwValue = 0; + if (g_sOptions.bNoAlphaBlending)dwValue = 1; + RegSetValueExA(g_hRegistry,"NoTransparency",0,REG_DWORD,(const BYTE*)&dwValue,4); +} + //------------------------------------------------------------------------------- // Toggle the "LowQuality" state //------------------------------------------------------------------------------- @@ -777,13 +790,13 @@ void DisplayMemoryConsumption() char szOut[2048]; sprintf(szOut, - "(1 KB = 1024 Byte)\n\n" - "ASSIMP Import Data: \t%i KB\n" - "Texture data:\t\t%i KB\n" - "Vertex buffers:\t\t%i KB\n" - "Index buffers:\t\t%i KB\n" - "Video Memory:\t\t%i KB\n\n" - "Total: \t\t\t%i KB", + "(1 KiB = 1024 bytes)\n\n" + "ASSIMP Import Data: \t%i KiB\n" + "Texture data:\t\t%i KiB\n" + "Vertex buffers:\t\t%i KiB\n" + "Index buffers:\t\t%i KiB\n" + "Video Memory:\t\t%i KiB\n\n" + "Total: \t\t\t%i KiB", iScene / 1024,iTexture / 1024,iVB / 1024,iIB / 1024,iVRAM / 1024, (iScene + iTexture + iVB + iIB + iVRAM) / 1024); MessageBox(g_hDlg,szOut,"Memory consumption",MB_OK); @@ -1106,6 +1119,20 @@ void InitUI() CheckDlgButton(g_hDlg,IDC_LOWQUALITY,BST_CHECKED); } + // LowQuality + if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"NoTransparency",NULL,NULL, + (BYTE*)&dwValue,&dwTemp))dwValue = 0; + if (0 == dwValue) + { + g_sOptions.bNoAlphaBlending = false; + CheckDlgButton(g_hDlg,IDC_NOAB,BST_UNCHECKED); + } + else + { + g_sOptions.bNoAlphaBlending = true; + CheckDlgButton(g_hDlg,IDC_NOAB,BST_CHECKED); + } + // DisplayNormals if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"RenderNormals",NULL,NULL, (BYTE*)&dwValue,&dwTemp))dwValue = 0; @@ -2020,6 +2047,10 @@ INT_PTR CALLBACK MessageProc(HWND hwndDlg,UINT uMsg, { ToggleSpecular(); } + else if (IDC_NOAB == LOWORD(wParam)) + { + ToggleTransparency(); + } else if (IDC_ZOOM == LOWORD(wParam)) { ToggleFPSView(); diff --git a/tools/assimp_view/RenderOptions.h b/tools/assimp_view/RenderOptions.h index fea743d75..9e0223186 100644 --- a/tools/assimp_view/RenderOptions.h +++ b/tools/assimp_view/RenderOptions.h @@ -37,7 +37,10 @@ class RenderOptions bNoSpecular (false), bStereoView (false), bCulling (false), - bSkeleton (false) {} + bSkeleton (false), + bNoAlphaBlending(false) + + {} bool bMultiSample; @@ -68,6 +71,8 @@ class RenderOptions // enable stereo view bool bStereoView; + bool bNoAlphaBlending; + // wireframe or solid rendering? DrawMode eDrawMode; diff --git a/tools/assimp_view/assimp_view.rc b/tools/assimp_view/assimp_view.rc index 4dc453889..8d4b51658 100644 --- a/tools/assimp_view/assimp_view.rc +++ b/tools/assimp_view/assimp_view.rc @@ -15,7 +15,7 @@ #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// -// Deutsch (Deutschland) resources +// German (Germany) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) #ifdef _WIN32 @@ -95,7 +95,7 @@ BEGIN COMBOBOX IDC_COMBO1,317,373,112,30,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP LTEXT "Nodes:",IDC_NUMNODES,221,413,28,9 EDITTEXT IDC_ENODEWND,253,411,37,14,ES_AUTOHSCROLL | ES_READONLY - CONTROL "",IDC_TREE1,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,474,0,141,484 + CONTROL "",IDC_TREE1,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_SHOWSELALWAYS | WS_BORDER | WS_HSCROLL | WS_TABSTOP,474,0,141,484 LTEXT "Mesh:",IDC_NUMMESHES,295,428,23,9 EDITTEXT IDC_EMESH,322,426,34,14,ES_AUTOHSCROLL | ES_READONLY CONTROL "",IDC_STATIC,"Static",SS_ETCHEDVERT,100,392,1,87 @@ -117,6 +117,7 @@ BEGIN CONTROL "",IDC_STATIC,"Static",SS_ETCHEDVERT,472,0,1,484 CONTROL "",IDC_STATIC,"Static",SS_ETCHEDVERT,365,392,1,70 CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,1,367,471,1 + CONTROL "No transparency",IDC_NOAB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,109,439,68,12 END IDD_LOADDIALOG DIALOGEX 0, 0, 143, 60 @@ -442,7 +443,7 @@ IDR_TEXT1 TEXT "text1.bin" IDR_HUD RCDATA "HUD.png" IDR_HUDMASK RCDATA "HUDMask.png" -#endif // Deutsch (Deutschland) resources +#endif // German (Germany) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/tools/assimp_view/resource.h b/tools/assimp_view/resource.h index b229d0860..0c3c0aa96 100644 --- a/tools/assimp_view/resource.h +++ b/tools/assimp_view/resource.h @@ -79,6 +79,8 @@ #define IDC_CHECK9 1024 #define IDC_NOSPECULAR 1024 #define IDC_PLAYANIM 1025 +#define IDC_3LIGHTS2 1025 +#define IDC_NOAB 1025 #define IDC_SPEED 1026 #define IDC_COMBO1 1027 #define IDC_PINORDER 1028 diff --git a/workspaces/vc9/assimp_view.vcproj b/workspaces/vc9/assimp_view.vcproj index b759f2dcb..78a07c9b2 100644 --- a/workspaces/vc9/assimp_view.vcproj +++ b/workspaces/vc9/assimp_view.vcproj @@ -1563,6 +1563,10 @@ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" > + +