// 얘는 DDModel 안으로 이동해야 할 듯 void SkinnedMesh::DrawMeshContainer( LPD3DXMESHCONTAINER pMeshContainerBase, LPD3DXFRAME pFrameBase ) { D3DXMESHCONTAINER_DERIVED* pMeshContainer = (D3DXMESHCONTAINER_DERIVED*)pMeshContainerBase; UINT iAttrib; LPD3DXBONECOMBINATION pBoneComb; UINT iMatrixIndex; UINT iPaletteEntry; D3DXMATRIXA16 matTemp; D3DCAPS9 d3dCaps; LPDIRECT3DDEVICE9 pD3DDevice = DDRenderer::GetInstance()->GetDevice(); pD3DDevice->GetDeviceCaps( &d3dCaps ); // 스킨 정보있나 살펴본다 // 스킨 형식이 아니면 안 그린다 if ( pMeshContainer->pSkinInfo != NULL ) { if ( pMeshContainer->UseSoftwareVP ) { // If hw or pure hw vertex processing is forced, we can't render the // mesh, so just exit out. Typical applications should create // a device with appropriate vertex processing capability for this // skinning method. if ( m_dwBehaviorFlags & D3DCREATE_HARDWARE_VERTEXPROCESSING ) return; if ( FAILED( pD3DDevice->SetSoftwareVertexProcessing( TRUE ) ) ) { assert( false ); return; } } // 본 변환 행렬 배열을 가져온다 pBoneComb = reinterpret_cast<LPD3DXBONECOMBINATION>( pMeshContainer->pBoneCombinationBuf->GetBufferPointer() ); // 카메라가 바라보는 시점 - 위치값은 반영 안 되어 있는데... DDCamera* camera = GPlayerManager->GetCamera(); if ( !camera ) return; m_MatView = camera->GetMatView(); // 순회하면서 변환을 적용 for ( iAttrib = 0; iAttrib < pMeshContainer->NumAttributeGroups; iAttrib++ ) { // first calculate all the world matrices for ( iPaletteEntry = 0; iPaletteEntry < pMeshContainer->NumPaletteEntries; ++iPaletteEntry ) { iMatrixIndex = pBoneComb[iAttrib].BoneId[iPaletteEntry]; if ( iMatrixIndex != UINT_MAX ) { // 저장되어 있는 본의 변환행렬(오프셋 + 변형)을 구해서 월드좌표계에 곱해서 그려질 좌표계를 구한 뒤 // m_pBoneMatrices에 일단 저장한다. // 이미 월드 좌표계를 기준으로 모델이 어느 위치에 있는지는 정해져 있는데, 이를 어떤 방향에서 바라볼지 셰이더에게 알려주기 위해서 카메라 정보를 곱한다 D3DXMatrixMultiply( &matTemp, &pMeshContainer->pBoneOffsetMatrices[iMatrixIndex], pMeshContainer->ppBoneMatrixPtrs[iMatrixIndex] ); D3DXMatrixMultiply( &m_pBoneMatrices[iPaletteEntry], &matTemp, &m_MatView ); } } // 셰이더 파일에 변환이 적용된 본의 데이터를 넘겨준다. 이때 본의 숫자도 넘겨준다. if ( FAILED( m_pEffect->SetMatrixArray( "mWorldMatrixArray", m_pBoneMatrices, pMeshContainer->NumPaletteEntries ) ) ) { assert( false ); return; } // 여기서부터는 셰이더에 필요한 데이터 넘겨서 실제 메시 그린 다음 렌더 방식 원래대로 돌려놓는 코드 // Sum of all ambient and emissive contribution D3DXCOLOR color1( pMeshContainer->pMaterials[pBoneComb[iAttrib].AttribId].MatD3D.Ambient ); D3DXCOLOR color2( .25, .25, .25, 1.0 ); D3DXCOLOR ambEmm; D3DXColorModulate( &ambEmm, &color1, &color2 ); ambEmm += D3DXCOLOR( pMeshContainer->pMaterials[pBoneComb[iAttrib].AttribId].MatD3D.Emissive ); // set material color properties if ( FAILED( m_pEffect->SetVector( "MaterialDiffuse", (D3DXVECTOR4*)&( pMeshContainer->pMaterials[pBoneComb[iAttrib].AttribId].MatD3D.Diffuse ) ) ) ) { assert( false ); return; } if ( FAILED( m_pEffect->SetVector( "MaterialAmbient", (D3DXVECTOR4*)&ambEmm ) ) ) { assert( false ); return; } // setup the material of the mesh subset - REMEMBER to use the original pre-skinning attribute id to get the correct material id if ( FAILED( pD3DDevice->SetTexture( 0, pMeshContainer->ppTextures[pBoneComb[iAttrib].AttribId] ) ) ) { assert( false ); return; } // Set CurNumBones to select the correct vertex shader for the number of bones if ( FAILED( m_pEffect->SetInt( "CurNumBones", pMeshContainer->NumInfl - 1 ) ) ) { assert( false ); return; } // Start the effect now all parameters have been updated UINT numPasses; if ( FAILED( m_pEffect->Begin( &numPasses, D3DXFX_DONOTSAVESTATE ) ) ) { assert( false ); return; } for ( UINT iPass = 0; iPass < numPasses; iPass++ ) { if ( FAILED( m_pEffect->BeginPass( iPass ) ) ) { assert( false ); return; } // draw the subset with the current world matrix palette and material state if ( FAILED( pMeshContainer->MeshData.pMesh->DrawSubset( iAttrib ) ) ) { assert( false ); return; } if ( FAILED( m_pEffect->EndPass() ) ) { assert( false ); return; } } if ( FAILED( m_pEffect->End() ) ) { assert( false ); return; } if ( FAILED( pD3DDevice->SetVertexShader( NULL ) ) ) { assert( false ); return; } } // remember to reset back to hw vertex processing if software was required if ( pMeshContainer->UseSoftwareVP ) { if ( FAILED( pD3DDevice->SetSoftwareVertexProcessing( FALSE ) ) ) { assert( false ); return; } } } else // bug out as unsupported mode { return; } }
void CPythonMiniMap::Render(float fScreenX, float fScreenY) { CPythonBackground& rkBG=CPythonBackground::Instance(); if (!rkBG.IsMapOutdoor()) return; if (!m_bShow) return; if (!rkBG.IsMapReady()) return; if (m_fScreenX != fScreenX || m_fScreenY != fScreenY) { m_fScreenX = fScreenX; m_fScreenY = fScreenY; __SetPosition(); } STATEMANAGER.SaveTextureStageState(0, D3DTSS_MIPFILTER, D3DTEXF_POINT); STATEMANAGER.SaveTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_POINT); STATEMANAGER.SaveTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_POINT); STATEMANAGER.SaveTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); STATEMANAGER.SaveTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); STATEMANAGER.SaveTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION); STATEMANAGER.SaveTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2); STATEMANAGER.SaveTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); STATEMANAGER.SaveTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); STATEMANAGER.SaveTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); STATEMANAGER.SaveTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); STATEMANAGER.SaveTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); STATEMANAGER.SaveTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE); STATEMANAGER.SaveTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT); STATEMANAGER.SaveTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE); STATEMANAGER.SaveTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); STATEMANAGER.SaveTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_CURRENT); STATEMANAGER.SaveTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); STATEMANAGER.SaveRenderState(D3DRS_TEXTUREFACTOR, 0xFF000000); STATEMANAGER.SetTexture(1, m_MiniMapFilterGraphicImageInstance.GetTexturePointer()->GetD3DTexture()); STATEMANAGER.SetTransform(D3DTS_TEXTURE1, &m_matMiniMapCover); STATEMANAGER.SetVertexShader(D3DFVF_XYZ | D3DFVF_TEX1); STATEMANAGER.SetStreamSource(0, m_VertexBuffer.GetD3DVertexBuffer(), 20); STATEMANAGER.SetIndices(m_IndexBuffer.GetD3DIndexBuffer(), 0); STATEMANAGER.SetTransform(D3DTS_WORLD, &m_matWorld); for (BYTE byTerrainNum = 0; byTerrainNum < AROUND_AREA_NUM; ++byTerrainNum) { LPDIRECT3DTEXTURE8 pMiniMapTexture = m_lpMiniMapTexture[byTerrainNum]; STATEMANAGER.SetTexture(0, pMiniMapTexture); if (pMiniMapTexture) { CStateManager& rkSttMgr=CStateManager::Instance(); rkSttMgr.DrawIndexedPrimitive(D3DPT_TRIANGLELIST, byTerrainNum * 4, 4, byTerrainNum * 6, 2); } else { STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR); STATEMANAGER.DrawIndexedPrimitive(D3DPT_TRIANGLELIST, byTerrainNum * 4, 4, byTerrainNum * 6, 2); STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); } } STATEMANAGER.RestoreRenderState(D3DRS_TEXTUREFACTOR); STATEMANAGER.RestoreTextureStageState(1, D3DTSS_ALPHAARG2); STATEMANAGER.RestoreTextureStageState(1, D3DTSS_ALPHAARG1); STATEMANAGER.RestoreTextureStageState(1, D3DTSS_ALPHAOP); STATEMANAGER.RestoreTextureStageState(1, D3DTSS_COLORARG1); STATEMANAGER.RestoreTextureStageState(1, D3DTSS_COLORARG2); STATEMANAGER.RestoreTextureStageState(1, D3DTSS_COLOROP); STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ALPHAARG2); STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ALPHAARG1); STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ALPHAOP); STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG1); STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG2); STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLOROP); STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ADDRESSU); STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ADDRESSV); STATEMANAGER.RestoreTextureStageState(1, D3DTSS_TEXCOORDINDEX); STATEMANAGER.RestoreTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS); STATEMANAGER.RestoreTextureStageState(1, D3DTSS_ADDRESSU); STATEMANAGER.RestoreTextureStageState(1, D3DTSS_ADDRESSV); SetDiffuseOperation(); STATEMANAGER.SetTransform(D3DTS_WORLD, &m_matIdentity); STATEMANAGER.SaveRenderState(D3DRS_TEXTUREFACTOR, 0xFFFFFFFF); STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR); STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE); STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); STATEMANAGER.SaveTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR); STATEMANAGER.SaveTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE); STATEMANAGER.SaveTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2); TInstancePositionVectorIterator aIterator; if (m_fScale >= 2.0f) { // Monster STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, CInstanceBase::GetIndexedNameColor(CInstanceBase::NAMECOLOR_MOB));//m_MarkTypeToColorMap[TYPE_MONSTER]); aIterator = m_MonsterPositionVector.begin(); while (aIterator != m_MonsterPositionVector.end()) { TMarkPosition & rPosition = *aIterator; m_WhiteMark.SetPosition(rPosition.m_fX, rPosition.m_fY); m_WhiteMark.Render(); ++aIterator; } // Other PC aIterator = m_OtherPCPositionVector.begin(); while (aIterator != m_OtherPCPositionVector.end()) { TMarkPosition & rPosition = *aIterator; STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, CInstanceBase::GetIndexedNameColor(rPosition.m_eNameColor)); m_WhiteMark.SetPosition(rPosition.m_fX, rPosition.m_fY); m_WhiteMark.Render(); ++aIterator; } // Party PC if (!m_PartyPCPositionVector.empty()) { float v = (1+sinf(CTimer::Instance().GetCurrentSecond()*6))/5+0.6; D3DXCOLOR c(CInstanceBase::GetIndexedNameColor(CInstanceBase::NAMECOLOR_PARTY));//(m_MarkTypeToColorMap[TYPE_PARTY]); D3DXCOLOR d(v,v,v,1); D3DXColorModulate(&c,&c,&d); STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, (DWORD)c); aIterator = m_PartyPCPositionVector.begin(); while (aIterator != m_PartyPCPositionVector.end()) { TMarkPosition & rPosition = *aIterator; m_WhiteMark.SetPosition(rPosition.m_fX, rPosition.m_fY); m_WhiteMark.Render(); ++aIterator; } } } // NPC STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, CInstanceBase::GetIndexedNameColor(CInstanceBase::NAMECOLOR_NPC)); aIterator = m_NPCPositionVector.begin(); while (aIterator != m_NPCPositionVector.end()) { TMarkPosition & rPosition = *aIterator; m_WhiteMark.SetPosition(rPosition.m_fX, rPosition.m_fY); m_WhiteMark.Render(); ++aIterator; } // Warp STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, CInstanceBase::GetIndexedNameColor(CInstanceBase::NAMECOLOR_WARP)); aIterator = m_WarpPositionVector.begin(); while (aIterator != m_WarpPositionVector.end()) { TMarkPosition & rPosition = *aIterator; m_WhiteMark.SetPosition(rPosition.m_fX, rPosition.m_fY); m_WhiteMark.Render(); ++aIterator; } STATEMANAGER.RestoreRenderState(D3DRS_TEXTUREFACTOR); STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ALPHAARG2); STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ALPHAARG1); STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ALPHAOP); STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG1); STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG2); STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLOROP); STATEMANAGER.RestoreTextureStageState(0, D3DTSS_MIPFILTER); STATEMANAGER.RestoreTextureStageState(0, D3DTSS_MINFILTER); STATEMANAGER.RestoreTextureStageState(0, D3DTSS_MAGFILTER); STATEMANAGER.SaveTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR); STATEMANAGER.SaveTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); // 캐릭터 마크 CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetMainInstancePtr(); if (pkInst) { float fRotation; fRotation = (540.0f - pkInst->GetRotation()); while(fRotation > 360.0f) fRotation -= 360.0f; while(fRotation < 0.0f) fRotation += 360.0f; m_PlayerMark.SetRotation(fRotation); m_PlayerMark.Render(); } // Target { TAtlasMarkInfoVector::iterator itor = m_AtlasWayPointInfoVector.begin(); for (; itor != m_AtlasWayPointInfoVector.end(); ++itor) { TAtlasMarkInfo & rAtlasMarkInfo = *itor; if (TYPE_TARGET != rAtlasMarkInfo.m_byType) continue; if (rAtlasMarkInfo.m_fMiniMapX <= 0.0f) continue; if (rAtlasMarkInfo.m_fMiniMapY <= 0.0f) continue; __RenderTargetMark(rAtlasMarkInfo.m_fMiniMapX, rAtlasMarkInfo.m_fMiniMapY); } } CCamera* pkCmrCur=CCameraManager::Instance().GetCurrentCamera(); // 카메라 방향 if (pkCmrCur) { m_MiniMapCameraraphicImageInstance.SetRotation(pkCmrCur->GetRoll()); m_MiniMapCameraraphicImageInstance.Render(); } STATEMANAGER.RestoreTextureStageState(0, D3DTSS_MINFILTER); STATEMANAGER.RestoreTextureStageState(0, D3DTSS_MAGFILTER); }