// RBspScene.cpp: implementation of the RBspScene class. // ////////////////////////////////////////////////////////////////////// #include "RBspScene.h" #include "SceneManager.h" #include "Sphere.h" #include "BaseGraphicsLayer.h" #include "SceneStateMgr.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// D3DXVECTOR3 g_vecCube[8] = { D3DXVECTOR3(-5.0f,-5.0f,-5.0f), // 0 D3DXVECTOR3(-5.0f,5.0f,-5.0f), // 1 D3DXVECTOR3(5.0f,-5.0f,-5.0f), // 2 D3DXVECTOR3(5.0f,5.0f,-5.0f), // 3 D3DXVECTOR3(-5.0f,-5.0f,5.0f), // 4 D3DXVECTOR3(-5.0f,5.0f,5.0f), // 5 D3DXVECTOR3(5.0f,-5.0f,5.0f), // 6 D3DXVECTOR3(5.0f,5.0f,5.0f), // 7 }; WORD g_vecCubeIndex[36] = { 0,1,2,2,1,3, // ¾Õ¸é 6,5,4,7,5,6, // µÞ¸é 1,5,3,3,5,7, // À­¸é 2,4,0,6,4,2, // ¾Æ·§¸é 2,3,6,6,3,7, // ¿À¸¥¸é 4,5,0,0,5,1, // ¿Þ¸é }; RBspScene::RBspScene() { memset(m_strBspName,0,sizeof(char) * RBSPBUF_SIZE); m_vecStartPos = vector3(0.0f,0.0f,0.0f); m_bVisible = false; m_pDotVertex = NULL; // Leaf Faces m_iLeafFacesNum = 0; m_pLeafFaces = NULL; // Plane m_iPlanesNum = 0; m_pPlanes = NULL; // Leaf Brush m_iLeafBrushesNum = 0; m_pLeafBrushes = NULL; // The index into the brush array // Brush m_iBrushesNum = 0; m_pBrushes = NULL; // Brush Side m_iBrusheSidesNum = 0; m_pBrusheSides = NULL; // Leaf Node m_iLeafsNum = 0; m_pLeafs = NULL; // Node m_iNodesNum = 0; m_pNodes = NULL; // Lightmap m_iLightMapsNum = 0; m_pLightMaps = NULL; m_pLightTextures = NULL; // Texture Def m_iTextureDefsNum = 0; m_pTextureDefs = NULL; m_pTextures = NULL; m_pNTextures = NULL; m_pFrustum = NULL; // Faces m_iFacesNum = 0; m_pFaces = NULL; // Vertexs m_iVertsNum = 0; m_pBeforeVerts = NULL; // ¿ø·¡ bsp ¿¡¼­ »ç¿ëÇÏ´Â vertex class m_pVerts = NULL; // ÃÖÀûÈ­¸¦ À§ÇÑ vertex class m_iVisLeafNodeNum = 0; // Triangle List // Base Texture Vertex Buffer m_pBaseVertexBuffer = NULL; // LightMap Vertex Buffer m_pLightVertexBuffer = NULL; m_pBaseVertexNum = NULL; m_pBaseVertexUseNum = NULL; // Base Index Buffer m_pBaseIndexBuffer = NULL; m_pBaseIndexNum = NULL; m_pBaseIndexUseNum = NULL; m_pIndexArr.clear(); m_pVertexArr.clear(); m_pLightUnit = NULL; // Current Camera Position m_vecCamera = D3DXVECTOR3(0.0f,0.0f,0.0f); m_iShaderVersion = RBSPSHADER_GF2; m_iRBspLeafIndex = -1; m_pVisLeafs = NULL; // Visible Leaf m_iVisLeafs = 0; // Visible Leaf °¹¼ö m_pBVisLeafs = NULL; // Visible Leaf m_iBVisLeafs = 0; // Visible Leaf °¹¼ö m_pLeafExs = NULL; m_D3Device = NULL; m_bVisEffectBox = true; m_bVisSoundBox = true; m_bVisAObjectBox = true; m_bVisLightBox = true; m_vecScale = D3DXVECTOR3(4.0f,4.0f,4.0f); } RBspScene::~RBspScene() { int i; if(m_pDotVertex != NULL) { delete[] m_pDotVertex; m_pDotVertex = NULL; } // Leaf Faces if(m_pLeafFaces != NULL) { delete[] m_pLeafFaces; m_pLeafFaces = NULL; } // Plane if(m_pPlanes != NULL) { delete[] m_pPlanes; m_pPlanes = NULL; } // Leaf Brush if(m_pLeafBrushes != NULL) { delete[] m_pLeafBrushes; m_pLeafBrushes = NULL; // The index into the brush array } // Brush if(m_pBrushes != NULL) { delete[] m_pBrushes; m_pBrushes = NULL; } // Brush Side if(m_pBrusheSides != NULL) { delete[] m_pBrusheSides; m_pBrusheSides = NULL; } // Leaf Node if(m_pLeafs != NULL) { delete[] m_pLeafs; m_pLeafs = NULL; } if(m_pLeafExs != NULL) { delete[] m_pLeafExs; m_pLeafExs = NULL; } // Node if(m_pNodes != NULL) { delete[] m_pNodes; m_pNodes = NULL; } // Lightmap if(m_pLightMaps != NULL) { delete[] m_pLightMaps; m_pLightMaps = NULL; } if(m_pLightTextures != NULL) { delete[] m_pLightTextures; m_pLightTextures = NULL; } // Texture Def if(m_pTextureDefs != NULL) { delete[] m_pTextureDefs; m_pTextureDefs = NULL; } if(m_pTextures != NULL) { delete[] m_pTextures; m_pTextures = NULL; } if(m_pNTextures != NULL) { delete[] m_pNTextures; m_pNTextures = NULL; } // Faces if(m_pFaces != NULL) { delete[] m_pFaces; m_pFaces = NULL; } if(m_pFrustum != NULL) { delete m_pFrustum; m_pFrustum = NULL; } // Vertexs if(m_pBeforeVerts != NULL) { delete[] m_pBeforeVerts; m_pBeforeVerts = NULL; // ¿ø·¡ bsp ¿¡¼­ »ç¿ëÇÏ´Â vertex class } if(m_pVerts != NULL) { delete[] m_pVerts; m_pVerts = NULL; // ÃÖÀûÈ­¸¦ À§ÇÑ vertex class } for(i=0;i 0) m_pIndexArr[i] = new WORD[m_pBaseIndexNum[i]]; if(m_pBaseVertexNum[i] > 0) m_pVertexArr[i] = new RBseVertex[m_pBaseVertexNum[i]]; } */ } void RBspScene::CreateBufferNum() { if(m_iShaderVersion == RBSPSHADER_GF2) { int i; memset(m_pBaseVertexNum,0,sizeof(int) * m_iTextureDefsNum ); memset(m_pBaseIndexNum,0,sizeof(int) * m_iTextureDefsNum ); ClearBufferNum(); for( i = 0; i < m_iFacesNum; i++ ) // Buffer Size Setting { int iFaceVertNum = m_pFaces[i].m_iVertexNum; int iBaseTexId = m_pFaces[i].m_iTexId; int iLightTexId = m_pFaces[i].m_iLightMapId; m_pBaseVertexNum[ iBaseTexId ] += iFaceVertNum; m_pBaseIndexNum[ iBaseTexId ] += (iFaceVertNum - 2) * 3; } //vector push for(i=0;i 0) m_pIndexArr[i] = new WORD[m_pBaseIndexNum[i]]; if(m_pBaseVertexNum[i] > 0) m_pVertexArr[i] = new RBspDrawVertex[m_pBaseVertexNum[i]]; } } } // Create BaseTexture Buffer(vertex,index), LightMap Buffer(vertex,index) void RBspScene::CreateBuffer() { int i; HRESULT hr = 0; for( i = 0; i < m_iTextureDefsNum; i++ ) // Base Texture's Buffer Create { if(m_pBaseVertexNum[i] > 0 ) { if(m_iShaderVersion == RBSPSHADER_GF2) { hr = m_D3Device->CreateVertexBuffer(m_pBaseVertexNum[i] * sizeof(RBspDrawVertex),D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC, dwRBSPUseFVF,D3DPOOL_DEFAULT,&(m_pBaseVertexBuffer[i])); } else if(m_iShaderVersion == RBSPSHADER_GF3) { /* hr = m_D3Device->CreateVertexBuffer(m_pBaseVertexNum[i] * sizeof(WBDotVertex),D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC, 0,D3DPOOL_DEFAULT,&(m_pBaseVertexBuffer[i])); hr = m_D3Device->CreateVertexBuffer(m_pBaseVertexNum[i] * sizeof(RBspLightVertex),D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC, 0,D3DPOOL_DEFAULT,&(m_pLightVertexBuffer[i])); */ } } else { m_pBaseVertexBuffer[i] = NULL; } if(m_pBaseIndexNum[i] > 0) { hr = m_D3Device->CreateIndexBuffer(m_pBaseIndexNum[i] * sizeof(WORD),D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC, D3DFMT_INDEX16,D3DPOOL_DEFAULT,&(m_pBaseIndexBuffer[i])); } else m_pBaseIndexBuffer[i] = NULL; } } int RBspScene::ClusterVisibleTest(int iCurrentCluster,int iTestCluster) { // iCurrentCluster ¿¡¼­ iTestCluster °¡ º¸ÀÌ´ÂÁö Test int iReturn = 0; if( !(m_VisData.m_pBitsets) || (iCurrentCluster < 0) ) return 1; byte VisSet = m_VisData.m_pBitsets[ (iCurrentCluster * m_VisData.m_iBytesPerCluster) + (iTestCluster / 8) ]; iReturn = VisSet & ( 1 << ( (iTestCluster) & 7 ) ); // 1 : visible 0 : not visible return iReturn; } int RBspScene::FindWorldLeaf(D3DXVECTOR3 vecPos) { D3DXVECTOR3 vecLocal = WorldToLocalPos(vecPos); return FindLeafNode(vecLocal); } int RBspScene::FindLeafNode(D3DXVECTOR3 vecPos) { int iChildIndex = 0; float fDistance = 0.0f; // Leaf ³ëµå´Â Front Child Index ¿Í Back Child Index °¡ RBSP_EMPTY(-1) ÀÌ´Ù while( iChildIndex >= 0 ) { RBspNode rNode = m_pNodes[ iChildIndex ]; RBspPlane rPlane = m_pPlanes[ rNode.m_iPlaneIndex ]; // Plane°úÀÇ °Å¸® °è»ê fDistance = ((rPlane.m_vecNormal.x * vecPos.x) + (rPlane.m_vecNormal.y * vecPos.y) + (rPlane.m_vecNormal.z * vecPos.z)) - rPlane.m_fDistance; // ÇöÁ¦ ³ëµåÀÇ ¾ÕÀ̸é if(fDistance >= 0) iChildIndex = rNode.m_iFrontCIndex; else iChildIndex = rNode.m_iBackCIndex; } // Return (same thing as saying: return -(iChildIndex + 1)). // À̹ø ³ëµåÀÇ index return return ~iChildIndex; } // Slide ¾ø´Â collision check void RBspScene::CheckCollisiontoBrushe2() { //Brushe ¼øÈ¸ CheckBrusheNode( 0,0.0f, 1.0f, m_WalkUnit.m_vecBPos, m_WalkUnit.m_vecPos); if(m_WalkUnit.m_fFraction == 1.0f) // Not Collision { m_WalkUnit.m_vecOPos = m_WalkUnit.m_vecPos; } else // Collision { m_WalkUnit.m_vecOPos = m_WalkUnit.m_vecBPos + (m_WalkUnit.m_fFraction * (m_WalkUnit.m_vecPos - m_WalkUnit.m_vecBPos)); } } void RBspScene::CheckCollisiontoBrushe(CollisionType &CT) { int i; //Brushe ¼øÈ¸ CheckBrusheNode( 0,0.0f, 1.0f, m_WalkUnit.m_vecBPos, m_WalkUnit.m_vecPos); if(m_WalkUnit.m_fFraction == 1.0f) // Not Collision { m_WalkUnit.m_vecOPos = m_WalkUnit.m_vecPos; CT = CT_NONE; } else // Collision { // Sliding vector »ý¼º m_WalkUnit.m_vecSlide = D3DXVECTOR3(0.0f,0.0f,0.0f); // collision plane normal calc for( i = 0; i < m_WalkUnit.m_iCollisionPlanesNum; i++) { m_WalkUnit.m_vecSlide += m_pPlanes[(m_WalkUnit.m_iCollisionPlanes[i])].m_vecNormal; } D3DXVec3Normalize(&(m_WalkUnit.m_vecSlide),&(m_WalkUnit.m_vecSlide)); // CT Setting D3DXVECTOR3 vecTmpCT(0.0f,1.0f,0.0f); float fCTDot = D3DXVec3Dot(&(m_WalkUnit.m_vecSlide),&vecTmpCT); if(fCTDot >= 0.8f) { CT = CT_BOTTOM; } else { CT = CT_SIDE; } /// // ¿îµ¿¹æÇâ vector D3DXVECTOR3 vecDir = m_WalkUnit.m_vecPos - m_WalkUnit.m_vecBPos; // vecDir *= -1.0f; m_WalkUnit.m_vecSlide.y += 15.0f; m_WalkUnit.m_vecSlide.x += vecDir.x / 1.0f; m_WalkUnit.m_vecSlide.z += vecDir.z / 1.0f; // »õ·Î¿î position m_WalkUnit.m_vecPos = m_WalkUnit.m_vecBPos + m_WalkUnit.m_vecSlide; m_WalkUnit.m_fFraction = 1.0f; m_WalkUnit.m_bOutputStartsOut = true; m_WalkUnit.m_bOutputAllSolid = false; // »õ·Î¿î ¸ñÇ¥ position À» °¡Áö°í ´Ù½Ã Ãæµ¹ üũ CheckBrusheNode( 0,0.0f, 1.0f, m_WalkUnit.m_vecBPos,m_WalkUnit.m_vecPos); //if(m_WalkUnit.m_fFraction < 1.0f) // m_WalkUnit.m_fFraction = 0.0f; m_WalkUnit.m_vecOPos = m_WalkUnit.m_vecBPos + (m_WalkUnit.m_fFraction * (m_WalkUnit.m_vecPos - m_WalkUnit.m_vecBPos)); // ¶³¸² ¼öÁ¤ /**/ if(fabs(m_WalkUnit.m_vecOPos.y - m_WalkUnit.m_vecBPos.y) < 60.0f) m_WalkUnit.m_vecOPos.y = m_WalkUnit.m_vecBPos.y; } } /* void RBspScene::CheckBrusheNode(int iNodeIndex, float fStartFraction, float fEndFraction, D3DXVECTOR3 vecStart,D3DXVECTOR3 vecEnd) { int i; if(fStartFraction > m_WalkUnit.m_fFraction) return; if(iNodeIndex<0) { RBspLeafEx *pLeaf = &(m_pLeafExs[~iNodeIndex]); for( i = 0; i < pLeaf->m_iLeafBrushNum; i++ ) { RBspBrushe *pBrush = &(m_pBrushes[m_pLeafBrushes[pLeaf->m_iLeafBrush + i]]); if((pBrush->m_iBrusheSidesNum > 0) && (m_pTextureDefs[pBrush->m_iTexId].m_iContents & 1)) { CheckBrushe(pBrush); } } return; } RBspNode *pNode = &(m_pNodes[iNodeIndex]); RBspPlane *pPlane = &(m_pPlanes[pNode->m_iPlaneIndex]); float fStartDist = D3DXVec3Dot(&vecStart,&(pPlane->m_vecNormal)) - pPlane->m_fDistance; float fEndDist = D3DXVec3Dot(&vecEnd,&(pPlane->m_vecNormal)) - pPlane->m_fDistance; if(fStartDist >= 0 && fEndDist >= 0) { CheckBrusheNode( pNode->m_iFrontCIndex,fStartFraction,fEndFraction,vecStart,vecEnd); } else if(fStartDist < 0 && fEndDist < 0) { CheckBrusheNode( pNode->m_iBackCIndex,fStartFraction,fEndFraction,vecStart,vecEnd); } else { int side1, side2; float fraction1, fraction2; D3DXVECTOR3 vecMiddle; if(fStartDist< fEndDist) { side1 = pNode->m_iBackCIndex; side2 = pNode->m_iFrontCIndex; float inverseDistance = 1.0f / (fStartDist - fEndDist); fraction1 = (fStartDist - RBSPEPS) * inverseDistance; fraction2 = (fStartDist + RBSPEPS) * inverseDistance; } else if(fEndDist < fStartDist) { side1 = pNode->m_iFrontCIndex; side2 = pNode->m_iBackCIndex; float inverseDistance = 1.0f / (fStartDist - fEndDist); fraction1 = (fStartDist + RBSPEPS) * inverseDistance; fraction2 = (fStartDist - RBSPEPS) * inverseDistance; } else { side1 = pNode->m_iFrontCIndex; side2 = pNode->m_iBackCIndex; fraction1 = 1.0f; fraction2 = 0.0f; } if(fraction1 < 0.0f) fraction1 = 0.0f; else if(fraction1 > 1.0f) fraction1 = 1.0f; if(fraction2 < 0.0f) fraction2 = 0.0f; else if(fraction2 > 1.0f) fraction2 = 1.0f; vecMiddle = vecStart + (vecEnd - vecStart) * fraction1; float fMiddleFraction = fStartFraction + (fEndFraction - fStartFraction) * fraction1; CheckBrusheNode(side1,fStartFraction, fMiddleFraction, vecStart, vecMiddle ); vecMiddle = vecStart + (vecEnd - vecStart) * fraction2; fMiddleFraction = fStartFraction + (fEndFraction - fStartFraction) * fraction2; CheckBrusheNode(side2,fMiddleFraction, fEndFraction, vecMiddle, vecEnd ); } } void RBspScene::CheckBrushe(RBspScene::RBspBrushe *pBrushe) // Check Brush for Collision { int i; float fStartFraction = -1.0f; float fEndFraction = 1.0f; bool bStartsOut = false; bool bEndsOut = false; D3DXVECTOR3 vecCollisionNormal; for( i = 0; i < pBrushe->m_iBrusheSidesNum; i++ ) { RBspBrusheSide *pBrusheSide = &(m_pBrusheSides[pBrushe->m_iBrusheSide + i]); RBspPlane *pPlane = &(m_pPlanes[pBrusheSide->m_iPlaneIndex]); float fStartDist = D3DXVec3Dot(&(m_WalkUnit.m_vecBPos),&(pPlane->m_vecNormal)) - (pPlane->m_fDistance + m_WalkUnit.m_fRadius); float fEndDist = D3DXVec3Dot(&(m_WalkUnit.m_vecPos),&(pPlane->m_vecNormal)) - (pPlane->m_fDistance + m_WalkUnit.m_fRadius); if(fStartDist > 0) bStartsOut = true; if(fEndDist > 0) bEndsOut = true; if (fStartDist > 0 && fEndDist > 0) { return; } if (fStartDist <= 0 && fEndDist <= 0) { continue; } if (fStartDist > fEndDist) { float fFraction = (fStartDist - RBSPEPS) / (fStartDist - fEndDist); if (fFraction > fStartFraction) { fStartFraction = fFraction; vecCollisionNormal = pPlane->m_vecNormal; } } else { float fFraction = (fStartDist + RBSPEPS) / (fStartDist - fEndDist); if (fFraction < fEndFraction) fEndFraction = fFraction; } } if(bStartsOut == false) { m_WalkUnit.m_bOutputStartsOut = false; if (bEndsOut == false) m_WalkUnit.m_bOutputAllSolid = true; return; } if(fStartFraction < fEndFraction) { if ((fStartFraction > -1.0) && (fStartFraction < m_WalkUnit.m_fFraction)) { if(fStartFraction < 0) fStartFraction = 0; m_WalkUnit.m_fFraction = fStartFraction; m_WalkUnit.m_vecSlide = vecCollisionNormal; } } } */ void RBspScene::CheckBrusheNode(int iNodeIndex, float fStartFraction, float fEndFraction, D3DXVECTOR3 vecStart,D3DXVECTOR3 vecEnd) { int i; if (fStartFraction > m_WalkUnit.m_fFraction) return; if (iNodeIndex < 0) // leaf node { // parent node Get RBspLeafEx *pLeaf = &(m_pLeafExs[-(iNodeIndex + 1)]); int iStartBrushe = pLeaf->m_iLeafBrush; for (i = 0; i < pLeaf->m_iLeafBrushNum; i++) { int iBrushe = m_pLeafBrushes[iStartBrushe + i]; RBspBrushe *pBrushe = &(m_pBrushes[iBrushe]); if((pBrushe->m_iBrusheSidesNum > 0) && (m_pTextureDefs[pBrushe->m_iTexId].m_iContents & 1)) CheckBrushe(pBrushe); } return; } RBspNode *pNode = &(m_pNodes[iNodeIndex]); RBspPlane *pPlane = &(m_pPlanes[pNode->m_iPlaneIndex]); float fStartDist,fEndDist,fRadius; fStartDist = D3DXVec3Dot(&vecStart,&(pPlane->m_vecNormal)) - pPlane->m_fDistance; fEndDist = D3DXVec3Dot(&vecEnd,&(pPlane->m_vecNormal)) - pPlane->m_fDistance; fRadius = m_WalkUnit.m_fRadius; if( fStartDist >= fRadius && fEndDist >= fRadius) { // start, end pos ¸ðµÎ Çö ³ëµåÀÇ ¾Õ¸é¿¡ Á¸Àç // ¾Õ³ëµå·Î ³»·Á°¨ CheckBrusheNode(pNode->m_iFrontCIndex,fStartFraction,fEndFraction,vecStart,vecEnd); } else if(fStartDist < -fRadius && fEndDist < -fRadius) { // Start, End Pos ¸ðµÎ Çö ³ëµåÀÇ µÞ¸é¿¡ Á¸Àç // µÞ³ëµå·Î ³»·Á°¨ CheckBrusheNode(pNode->m_iBackCIndex,fStartFraction,fEndFraction,vecStart,vecEnd); } else // Çö ³ëµå { // µÎ ºÎºÐÀ¸·Î ³ª´«´Ù int iSide; float fFractionFront,fFractionBack,fMidFraction; D3DXVECTOR3 vecMid; if (fStartDist < fEndDist) { iSide = RBSP_BACK; // back float fInverseDist = 1.0f / (fStartDist - fEndDist); fFractionFront = ((fStartDist - fRadius) + RBSPEPS) * fInverseDist; fFractionBack = ((fStartDist + fRadius) + RBSPEPS) * fInverseDist; } else if (fEndDist < fStartDist) { iSide = RBSP_FRONT; // front float fInverseDist = 1.0f / (fStartDist - fEndDist); fFractionFront = ((fStartDist + fRadius) + RBSPEPS) * fInverseDist; fFractionBack = ((fStartDist - fRadius) - RBSPEPS) * fInverseDist; } else { iSide = RBSP_FRONT; // front fFractionFront = 1.0f; fFractionBack = 0.0f; } // ¹üÀ§ ¼³Á¤ if (fFractionFront < 0.0f) fFractionFront = 0.0f; else if (fFractionFront > 1.0f) fFractionFront = 1.0f; if (fFractionBack < 0.0f) fFractionBack = 0.0f; else if (fFractionBack > 1.0f) fFractionBack = 1.0f; // À§¿¡¼­ ³ª´« mid fractionÀ» ÀÌ¿ë üũ ·çƾ µ¹¸² // ¾ÕºÎºÐ üũ fMidFraction = fStartFraction + (fEndFraction - fStartFraction) * fFractionFront; vecMid = vecStart + (fFractionFront * (vecEnd - vecStart)); if(iSide == RBSP_FRONT) CheckBrusheNode(pNode->m_iFrontCIndex,fStartFraction,fMidFraction,vecStart,vecMid); else CheckBrusheNode(pNode->m_iBackCIndex,fStartFraction,fMidFraction,vecStart,vecMid); // µÞºÎºÐ üũ fMidFraction = fStartFraction + (fEndFraction - fStartFraction) * fFractionBack; vecMid = vecStart + (fFractionBack * (vecEnd - vecStart)); if(iSide == RBSP_FRONT) CheckBrusheNode(pNode->m_iBackCIndex,fMidFraction,fEndFraction,vecMid,vecEnd); else CheckBrusheNode(pNode->m_iFrontCIndex,fMidFraction,fEndFraction,vecMid,vecEnd); } } void RBspScene::CheckBrushe(RBspScene::RBspBrushe *pBrushe) // Check Brush for Collision { int i,j; float fStartFraction = -1.0f; float fEndFraction = 1.0f; bool bStartsOut = false; bool bEndsOut = false; int iStartBrush = pBrushe->m_iBrusheSide; for( i = 0; i < pBrushe->m_iBrusheSidesNum; i++) { RBspBrusheSide *pBrusheSide = &(m_pBrusheSides[ iStartBrush + i ]); RBspPlane *pPlane = &(m_pPlanes[ pBrusheSide->m_iPlaneIndex ]); RBspTextureDef *pTextureDef = &(m_pTextureDefs[pBrusheSide->m_iTexId]); if(strstr(pTextureDef->m_strName,"fog_Type1") != NULL) // ¾È°³ continue; // Åõ¸í brush skip /* if((!strcmp("textures/common/caulk",pTextureDef->m_strName)) || // textures/common/caulk (!strcmp("textures/common/hint",pTextureDef->m_strName)) || // textures/common/hint (!strcmp("noshader",pTextureDef->m_strName))) // NoShader continue; */ float fStartDist,fEndDist; fStartDist = D3DXVec3Dot(&(m_WalkUnit.m_vecBPos),&(pPlane->m_vecNormal)) - (pPlane->m_fDistance + m_WalkUnit.m_fRadius); fEndDist = D3DXVec3Dot(&(m_WalkUnit.m_vecPos),&(pPlane->m_vecNormal)) - (pPlane->m_fDistance + m_WalkUnit.m_fRadius); if (fStartDist > 0.0f) bStartsOut = true; if (fEndDist > 0.0f) bEndsOut = true; // Side Check if ((fStartDist > 0.0f) && (fEndDist > 0.0f)) { // µÎ Á¡´Ù Çö brushe ¾Õ¿¡ ÀÖ´Ù,Çö brushe ¹Ù±ùÀÇ ÀÏÀÌ´Ù. return; } if ((fStartDist <= 0.0f) && (fEndDist <= 0.0f)) { // µÎ Á¡´Ù Çö brushe µÚ¿¡ ÀÖ´Ù continue; } if ( fStartDist > fEndDist ) { // line is entering into the brush float fFraction = (fStartDist - RBSPEPS) / (fStartDist - fEndDist); if (fFraction > fStartFraction) { fStartFraction = fFraction; // Collision Plane Setting //Collision Plane Index //m_WalkUnit.m_iCollisionPlane = i; bool bExistPlane = false; for(j = 0;j < m_WalkUnit.m_iCollisionPlanesNum;j++) { if(m_WalkUnit.m_iCollisionPlanes[j] == i) { bExistPlane = true; } } if(!bExistPlane && m_WalkUnit.m_iCollisionPlanesNum < 5) m_WalkUnit.m_iCollisionPlanes[ m_WalkUnit.m_iCollisionPlanesNum++ ] = pBrusheSide->m_iPlaneIndex; } } else { // line is leaving the brush float fFraction = (fStartDist + RBSPEPS) / (fStartDist - fEndDist); if (fFraction < fEndFraction) fEndFraction = fFraction; } } if (bStartsOut == false) { m_WalkUnit.m_bOutputStartsOut = false; if(bEndsOut == false) m_WalkUnit.m_bOutputAllSolid = true; return; } if (fStartFraction < fEndFraction) { if (fStartFraction > -1.0f && fStartFraction < m_WalkUnit.m_fFraction) { if (fStartFraction < 0.0f) fStartFraction = 0.0f; m_WalkUnit.m_fFraction = fStartFraction; } } } void RBspScene::UpdateLeaf(int iLeaf,bool bFrustum,int iCurrentCluster) { RBspLeafEx *pLeaf = &(m_pLeafExs[iLeaf]); int iFaceCount = 0; iFaceCount = pLeaf->m_iLeafFaceNum; if( iFaceCount <= 0 ) // face °¡ ¾ø´Â ³ëµå return; // ÇöÁ¦ Ä«¸Þ¶ó À§Ä¡ÀÎ leaf ÀÇ Å¬·¯½ºÅÍ index : iCurrentCluster // Visible test if(!ClusterVisibleTest(iCurrentCluster,pLeaf->m_iCluster)) return; // Frustum cull if(bFrustum) if(!m_pFrustum->BoxInFrustum(pLeaf->m_vecMinBox,pLeaf->m_vecMaxBox)) return; while( iFaceCount-- ) { int iFaceIndex = m_pLeafFaces[ pLeaf->m_iLeafFace + iFaceCount ]; if( m_pFaces[ iFaceIndex ].m_iFaceType != RBSP_POLYGON) // Polygon ¸¸ ·»´õ continue; if( !m_FaceRenderBit.GetBit(iFaceIndex) )// ±×·ÁÁø face °¡ ¾Æ´Ï¸é render { m_iVisLeafNodeNum++; m_FaceRenderBit.SetBit(iFaceIndex); PushFaceBuffer( iFaceIndex); } } } void RBspScene::UpdateNode(int iNode,bool bFrustum,int iCurrentCluster) { RBspNode *pNode = &(m_pNodes[iNode]); // »óÀ§ ³ëµå°¡ frustum ¾È¿¡ ÀÖÀ¸¸é ±× ³ëµå´Â ¹«Á¶°Ç frustum ¾È¿¡ ÀÖ´Ù. if(bFrustum){ if(!m_pFrustum->BoxInFrustum(pNode->m_vecMinBox,pNode->m_vecMaxBox)) { // À̳ëµå´Â Frustum ¹Ù±ùÀÌ´Ù. return; } else // À̳ëµå´Â frustum ¾ÈÀÌ´Ù.±×·¯¹Ç·Î ÀÚ½Ä ³ëµåµéÀº ¸ðµÎ ¾ÈÀÌ´Ù bFrustum = false; } // a node is an structure that hold a partition plane, all leaf are splited in two // groups: FRONT and BACK. plane is the partition plane for this node const RBspPlane *pPlane = &(m_pPlanes[ pNode->m_iPlaneIndex ]); // Ä«¸Þ¶ó°¡ ÇöÁ¦ Æò¸éÀÇ ¾ÕÀ̶ó¸é ¾Õ¿¡¼­ ºÎÅÍ ±×¸°´Ù if( (pPlane->m_vecNormal.x * m_WalkUnit.m_vecPos.x + pPlane->m_vecNormal.y * m_WalkUnit.m_vecPos.y + pPlane->m_vecNormal.z * m_WalkUnit.m_vecPos.z - pPlane->m_fDistance > 0) ) { // Front Child if(pNode->m_iFrontCIndex >= 0) UpdateNode((pNode->m_iFrontCIndex),bFrustum,iCurrentCluster); else UpdateLeaf(~(pNode->m_iFrontCIndex),bFrustum,iCurrentCluster); // Back Child if(pNode->m_iBackCIndex >= 0) UpdateNode((pNode->m_iBackCIndex),bFrustum,iCurrentCluster); else UpdateLeaf(~(pNode->m_iBackCIndex),bFrustum,iCurrentCluster); } else //µÞ¸é ºÎÅÍ ±×¸°´Ù { if(pNode->m_iBackCIndex >= 0) UpdateNode((pNode->m_iBackCIndex),bFrustum,iCurrentCluster); else UpdateLeaf(~(pNode->m_iBackCIndex),bFrustum,iCurrentCluster); if(pNode->m_iFrontCIndex >= 0) UpdateNode((pNode->m_iFrontCIndex),bFrustum,iCurrentCluster); else UpdateLeaf(~(pNode->m_iFrontCIndex),bFrustum,iCurrentCluster); } } D3DXVECTOR3 RBspScene::CollisionPoint(D3DXVECTOR3 vecBefore,D3DXVECTOR3 vecNew,float fRad) // Slide ¾ø´Â collision check { m_WalkUnit.m_vecBPos = vecBefore; m_WalkUnit.m_vecPos = vecNew; m_WalkUnit.m_fFraction = 1.0f; m_WalkUnit.m_bOutputStartsOut = true; m_WalkUnit.m_bOutputAllSolid = false; m_WalkUnit.m_fRadius = fRad; //m_WalkUnit.m_iCollisionPlane = RBSP_EMPTY; m_WalkUnit.m_iCollisionPlanesNum = 0; CheckCollisiontoBrushe2(); return m_WalkUnit.m_vecOPos; } D3DXVECTOR3 RBspScene::CollisionCheck(D3DXVECTOR3 vecBefore,D3DXVECTOR3 vecNew,float fRad,CollisionType &CT) { m_WalkUnit.m_vecBPos = vecBefore; m_WalkUnit.m_vecPos = vecNew; m_WalkUnit.m_fFraction = 1.0f; m_WalkUnit.m_bOutputStartsOut = true; m_WalkUnit.m_bOutputAllSolid = false; m_WalkUnit.m_fRadius = fRad; //m_WalkUnit.m_iCollisionPlane = RBSP_EMPTY; m_WalkUnit.m_iCollisionPlanesNum = 0; CheckCollisiontoBrushe(CT); return m_WalkUnit.m_vecOPos; } void RBspScene::UpdateScene(D3DXVECTOR3 vecPos,bool bColl) { bool bObjectUpdate = false; // Walk Unit Init m_WalkUnit.m_vecBPos = m_vecCamera; m_WalkUnit.m_vecPos = vecPos; m_WalkUnit.m_fFraction = 1.0f; m_WalkUnit.m_bOutputStartsOut = true; m_WalkUnit.m_bOutputAllSolid = false; //m_WalkUnit.m_iCollisionPlane = RBSP_EMPTY; m_WalkUnit.m_iCollisionPlanesNum = 0; //m_WalkUnit.m_vecOPos = vecPos; // if(bColl) // CheckCollisiontoBrushe(); // Brushe Collision // else m_WalkUnit.m_vecOPos = m_WalkUnit.m_vecPos; //m_vecCamera = m_WalkUnit.m_vecOPos; // Camera Position Setting //CSceneManager::m_ViewCamera->SetVecPosition(vector3(m_vecCamera.x,m_vecCamera.y,m_vecCamera.z)); //CSceneManager::m_ViewCamera->MoveFrustum(); m_pFrustum->Update(); //m_vecCamera = vecPos; // Camera Position Setting int iLeafIndex; // Leaf Node Index int iLeafClusterIndex; // Leaf Cluster Index int iLeafsNum = 0; int iFaceCount = 0; m_FaceRenderBit.ClearBits(); ClearBufferNum(); // Number Buffer Clear iLeafIndex = FindLeafNode(vecPos); m_iRBspLeafIndex = iLeafIndex; // World CreatorÀ» À§ÇÑ leaf index setting iLeafClusterIndex = m_pLeafExs[iLeafIndex].m_iCluster; m_iVisLeafNodeNum = 0; iLeafsNum = m_iLeafsNum; m_iBVisLeafs = m_iVisLeafs; // Backup memcpy(m_pBVisLeafs,m_pVisLeafs,sizeof(int) * m_iVisLeafs); // Backup m_iVisLeafs = 0; // Visible Leaf Zero Setting // Visible Leaf´Â ³ªÁß¿¡ R3S Object ¿Í Map Effect ¿¡ »ç¿ëµÈ´Ù // UpdateNode(0,true,iLeafClusterIndex); while(iLeafsNum--) { RBspLeafEx *pLeaf = &(m_pLeafExs[iLeafsNum]); iFaceCount = pLeaf->m_iLeafFaceNum; if( iFaceCount <= 0 ) // face °¡ ¾ø´Â ³ëµå continue; if(!ClusterVisibleTest(iLeafClusterIndex,pLeaf->m_iCluster)) continue; // Leaf Visible Setting m_pVisLeafs[m_iVisLeafs] = iLeafsNum; m_iVisLeafs++; // Frustum cull // m_pFrustum->Update(); if(!m_pFrustum->BoxInFrustum(pLeaf->m_vecMinBox,pLeaf->m_vecMaxBox)) continue; // while( iFaceCount-- ) { int iFaceIndex = m_pLeafFaces[ pLeaf->m_iLeafFace + iFaceCount ]; if( m_pFaces[ iFaceIndex ].m_iFaceType != RBSP_POLYGON) // Polygon ¸¸ ·»´õ continue; if( !m_FaceRenderBit.GetBit(iFaceIndex) )// ±×·ÁÁø face °¡ ¾Æ´Ï¸é render { m_iVisLeafNodeNum++; m_FaceRenderBit.SetBit(iFaceIndex); PushFaceBuffer( iFaceIndex); } } } if( m_iVisLeafs != m_iBVisLeafs) GenerateR3SObject(); else { int iCount = 0; for(int iCheck = 0; iCheck < m_iBVisLeafs; iCheck++) { if(m_pVisLeafs[iCheck] == m_pBVisLeafs[iCheck]) iCount++; } if(iCount != m_iBVisLeafs) GenerateR3SObject(); } // RCollisionDetection::SetTriangle(m_vColTriangle,m_iColTriangle); SetBuffer(); } bool RBspScene::FaceCulling(int iFaceIndex) // true: Frustum ¾È¿¡ face Á¸Àç , false frustum Culling { int iStartIndex = m_pFaces[iFaceIndex].m_iStartVertex; int iVertexNum = m_pFaces[iFaceIndex].m_iVertexNum; int i; for( i = 0; i < iVertexNum; i++ ) { if(m_pFrustum->PointInFrustum(m_pDotVertex[iStartIndex + i].m_vecPos.x, m_pDotVertex[iStartIndex + i].m_vecPos.y, m_pDotVertex[iStartIndex + i].m_vecPos.z)) return true; } return false; } void RBspScene::SetBuffer() { if(m_iShaderVersion == RBSPSHADER_GF3) { /*int i,j; vector DotVertex; vectorLightVertex; for(i=0;i 0) { //RBspShaderVertex *tmp = NULL; WBDotVertex *tmp = NULL; //m_pBaseVertexBuffer[i]->Lock(0,m_pBaseVertexUseNum[i] * sizeof(RBspShaderVertex),(BYTE **)&tmp,D3DLOCK_DISCARD); m_pBaseVertexBuffer[i]->Lock(0,m_pBaseVertexUseNum[i] * sizeof(WBDotVertex),(BYTE **)&tmp,D3DLOCK_DISCARD); RBspLightVertex *tmpLight = NULL; m_pLightVertexBuffer[i]->Lock(0,m_pBaseVertexUseNum[i] * sizeof(RBspLightVertex),(BYTE **)&tmpLight,D3DLOCK_DISCARD); //m_pBaseVertexBuffer[i]->Lock(0,m_pBaseVertexUseNum[i] * sizeof(RBspDrawVertex),(BYTE **)&tmp,0); /*for(j=0;jm_vecPos = DotVertex[i][j].m_vecPos; tmp->m_vecTangentS = DotVertex[i][j].m_vecS; tmp->m_vecTangentSxT = DotVertex[i][j].m_vecSxT; tmp->m_vecTexcoord = DotVertex[i][j].m_vecTexcoord; tmp++; }*/ /* memcpy(tmp,DotVertex[i],sizeof(WBDotVertex) * m_pBaseVertexUseNum[i]); memcpy(tmpLight,LightVertex[i],sizeof(RBspLightVertex) * m_pBaseVertexUseNum[i]); m_pBaseVertexBuffer[i]->Unlock(); m_pLightVertexBuffer[i]->Unlock(); } if(m_pBaseIndexUseNum[i] > 0) { WORD *tmp2 = NULL; m_pBaseIndexBuffer[i]->Lock(0,m_pBaseIndexUseNum[i] * sizeof(WORD),(BYTE **)&tmp2,D3DLOCK_DISCARD); //m_pBaseIndexBuffer[i]->Lock(0,m_pBaseIndexUseNum[i] * sizeof(WORD),(BYTE **)&tmp2,0); memcpy(tmp2,m_pIndexArr[i],sizeof(WORD) * m_pBaseIndexUseNum[i]); m_pBaseIndexBuffer[i]->Unlock(); } } for(i=0;i 0) { RBspDrawVertex *tmp = NULL; m_pBaseVertexBuffer[i]->Lock(0,m_pBaseVertexUseNum[i] * sizeof(RBspDrawVertex),(BYTE **)&tmp,D3DLOCK_DISCARD); memcpy(tmp,m_pVertexArr[i],sizeof(RBspDrawVertex) * m_pBaseVertexUseNum[i]); m_pBaseVertexBuffer[i]->Unlock(); } if(m_pBaseIndexUseNum[i] > 0) { WORD *tmp2 = NULL; m_pBaseIndexBuffer[i]->Lock(0,m_pBaseIndexUseNum[i] * sizeof(WORD),(BYTE **)&tmp2,D3DLOCK_DISCARD); memcpy(tmp2,m_pIndexArr[i],sizeof(WORD) * m_pBaseIndexUseNum[i]); m_pBaseIndexBuffer[i]->Unlock(); } } } } void RBspScene::PushFaceBuffer( int iFaceIndex ) // Face µéÀ» °¢ ÅØ½ºÃÄ¿¡ ÇØ´çÇÏ´Â ¹öÆÛ·Î ¸ðÀº´Ù { // Back Face ÄøµÀ» ÇÏ°í µé¾î°£´Ù int i; int iLightMapId = m_pFaces[iFaceIndex].m_iLightMapId; int iTextureId = m_pFaces[iFaceIndex].m_iTexId; int iVertexNum = m_pFaces[iFaceIndex].m_iVertexNum; int iIndexNum = (iVertexNum - 2) * 3; int iStartIndex = m_pFaces[iFaceIndex].m_iStartVertex; int iVertCount = m_pBaseVertexUseNum[iTextureId]; int iIndexCount = m_pBaseIndexUseNum[iTextureId]; // Base Texture Buffer Setting /// Check Face Position //D3DXVECTOR3 vec1 = m_pDotVertex[iStartIndex].m_vecPos - m_vecCamera; //D3DXVECTOR3 vec2 = m_pDotVertex[iFaceIndex].m_vecNormal; //D3DXVECTOR3 vec1 = m_pVerts[iStartIndex].m_vecPos - m_vecCamera; //D3DXVECTOR3 vec2 = m_pVerts[iFaceIndex].m_vecNormal; // Back Face Culling Code /*float fDot = D3DXVec3Dot(&vec1,&vec2); if(fDot >=0.8) return; */ int iCurrentUnit = m_pLightUnit[iTextureId].size(); // LightMap Id Setting if(iCurrentUnit == 0) { RBspLightUnit tmp; tmp.m_iLightId = iLightMapId; tmp.m_iStartIndex = 0; tmp.m_iStartVertIndex = 0; m_pLightUnit[iTextureId].push_back(tmp); } else if( (m_pLightUnit[iTextureId][iCurrentUnit - 1].m_iLightId) != iLightMapId) { RBspLightUnit tmp; tmp.m_iLightId = iLightMapId; tmp.m_iStartIndex = m_pBaseIndexUseNum[iTextureId]; tmp.m_iStartVertIndex = m_pBaseVertexUseNum[iTextureId]; m_pLightUnit[iTextureId].push_back(tmp); } for( i = 0; i < iVertexNum; i++) { //m_pVertexArr[iTextureId][iVertCount++] = m_pDotVertex[iStartIndex + i]; m_pVertexArr[iTextureId][iVertCount++] = m_pVerts[iStartIndex + i]; if( i < 3) { m_pIndexArr[iTextureId][iIndexCount++] = (m_pBaseVertexUseNum[iTextureId] + i); } else { m_pIndexArr[iTextureId][iIndexCount++] = (m_pBaseVertexUseNum[iTextureId]); m_pIndexArr[iTextureId][iIndexCount++] = (m_pBaseVertexUseNum[iTextureId] + i-1); m_pIndexArr[iTextureId][iIndexCount++] = (m_pBaseVertexUseNum[iTextureId] + i); } } m_pBaseVertexUseNum[iTextureId] += iVertexNum; m_pBaseIndexUseNum[iTextureId] += iIndexNum; /* if(!bSkipCollision) { if (fStartFraction < fEndFraction) { if (fStartFraction > -1 && fStartFraction < m_WalkUnit.m_fFraction) { if (fStartFraction < 0) fStartFraction = 0; m_WalkUnit.m_fFraction = fStartFraction; if(m_WalkUnit.m_fFraction < 0.8f) { MessageBox(NULL,"Collision","Coll",MB_OK); return; } } } } */ } void RBspScene::SetBox(D3DXVECTOR3 vecMin,D3DXVECTOR3 vecMax) { g_vecCube[0] = D3DXVECTOR3(vecMin.x,vecMin.y,vecMin.z); g_vecCube[1] = D3DXVECTOR3(vecMin.x,vecMax.y,vecMin.z); g_vecCube[2] = D3DXVECTOR3(vecMax.x,vecMin.y,vecMin.z); g_vecCube[3] = D3DXVECTOR3(vecMax.x,vecMax.y,vecMin.z); g_vecCube[4] = D3DXVECTOR3(vecMin.x,vecMin.y,vecMax.z); g_vecCube[5] = D3DXVECTOR3(vecMin.x,vecMax.y,vecMax.z); g_vecCube[6] = D3DXVECTOR3(vecMax.x,vecMin.y,vecMax.z); g_vecCube[7] = D3DXVECTOR3(vecMax.x,vecMax.y,vecMax.z); } void RBspScene::RenderEvent() { int i; int j; int iLeafIndex = m_iRBspLeafIndex; CSceneStateMgr::_SetD3DRenderState(D3DRS_LIGHTING,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,FALSE); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR ); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); m_D3Device->SetVertexShader(D3DFVF_XYZ); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState(D3DRS_FILLMODE,D3DFILL_SOLID); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW); D3DXMATRIX identity; D3DXMatrixIdentity(&identity); m_D3Device->SetTransform(D3DTS_WORLD,&identity); /* RBSPEVENT_OBJECTANI, // Dynamic Object RBSPEVENT_EFFECT, // Effect RBSPEVENT_SOUND, // Sound RBSPEVENT_TOTAL, m_bVisSoundBox = true; m_bVisAObjectBox = true; */ for( i = 0; i < m_iLeafsNum; i++ ) { if(m_bVisEffectBox) // Effect Box Render { for(j = 0; j < m_pLeafExs[i].m_iEventNum[RBSPEVENT_EFFECT]; j++) { // Local to world /* ///////////// D3DXVECTOR3 vecPos = m_pLeafExs[i].m_lstEffect[j]->m_vecCenter; D3DXMATRIX matTmp; D3DXMATRIX matInv; D3DXMatrixIdentity(&matTmp); matTmp._41 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.x; matTmp._42 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.y; matTmp._43 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.z; matInv = matTmp; D3DXMatrixIdentity(&matTmp); matTmp._41 = vecPos.x; matTmp._42 = vecPos.y; matTmp._43 = vecPos.z; D3DXMatrixMultiply(&matTmp,&matTmp,&matInv); vecPos.x = matTmp._41; vecPos.y = matTmp._42; vecPos.z = matTmp._43; ///////////*/ D3DXVECTOR3 vecMinBox = D3DXVECTOR3(m_pLeafExs[i].m_lstEffect[j]->m_vecCenter.x -10.0f, m_pLeafExs[i].m_lstEffect[j]->m_vecCenter.y -10.0f, m_pLeafExs[i].m_lstEffect[j]->m_vecCenter.z -10.0f); D3DXVECTOR3 vecMaxBox = D3DXVECTOR3(m_pLeafExs[i].m_lstEffect[j]->m_vecCenter.x +10.0f, m_pLeafExs[i].m_lstEffect[j]->m_vecCenter.y +10.0f, m_pLeafExs[i].m_lstEffect[j]->m_vecCenter.z +10.0f); SetBox(vecMinBox,vecMaxBox); if(m_pLeafExs[i].m_lstEffect[j] == m_pLeafExs[i].m_pPickEventEffect) { CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xffff0000); } else { CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xff00ff00); } m_D3Device->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0,8,12,g_vecCubeIndex,D3DFMT_INDEX16,g_vecCube,sizeof(D3DXVECTOR3)); } } if(m_bVisLightBox) { for(j = 0; j < m_pLeafExs[i].m_iLightNum; j++) { // Local to World CSphere tmpSphere; tmpSphere.SetTransparency(40); tmpSphere.SetColor(m_pLeafExs[i].m_lstLight[j].m_fRed, m_pLeafExs[i].m_lstLight[j].m_fGreen, m_pLeafExs[i].m_lstLight[j].m_fBlue); tmpSphere.SetRadius(m_pLeafExs[i].m_lstLight[j].m_vecLightRange.x); tmpSphere.Create(m_D3Device,10,20); ///////////// /*D3DXVECTOR3 vecPos = m_pLeafExs[i].m_lstLight[j].m_vecLight; D3DXMATRIX matTmp; D3DXMATRIX matInv; D3DXMatrixIdentity(&matTmp); matTmp._41 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.x; matTmp._42 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.y; matTmp._43 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.z; matInv = matTmp; D3DXMatrixIdentity(&matTmp); matTmp._41 = vecPos.x; matTmp._42 = vecPos.y; matTmp._43 = vecPos.z; D3DXMatrixMultiply(&matTmp,&matTmp,&matInv); vecPos.x = matTmp._41; vecPos.y = matTmp._42; vecPos.z = matTmp._43; */ /////////// D3DXVECTOR3 vecMinBox = D3DXVECTOR3(m_pLeafExs[i].m_lstLight[j].m_vecLight.x -10.0f, m_pLeafExs[i].m_lstLight[j].m_vecLight.y -10.0f, m_pLeafExs[i].m_lstLight[j].m_vecLight.z -10.0f); D3DXVECTOR3 vecMaxBox = D3DXVECTOR3(m_pLeafExs[i].m_lstLight[j].m_vecLight.x +10.0f, m_pLeafExs[i].m_lstLight[j].m_vecLight.y +10.0f, m_pLeafExs[i].m_lstLight[j].m_vecLight.z +10.0f); tmpSphere.SetPosition(m_pLeafExs[i].m_lstLight[j].m_vecLight.x,m_pLeafExs[i].m_lstLight[j].m_vecLight.y,m_pLeafExs[i].m_lstLight[j].m_vecLight.z); SetBox(vecMinBox,vecMaxBox); if((&m_pLeafExs[i].m_lstLight[j]) == m_pLeafExs[i].m_pPickLight) { CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xffff0000); } else { CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xff00ff00); } m_D3Device->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0,8,12,g_vecCubeIndex,D3DFMT_INDEX16,g_vecCube,sizeof(D3DXVECTOR3)); CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGENABLE,FALSE); tmpSphere.Render(); CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGENABLE,TRUE); } } } CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW); CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE,TRUE); } void RBspScene::RenderLeafBox() // Leaf Box render { int i; int iLeafIndex = m_iRBspLeafIndex; CSceneStateMgr::_SetD3DRenderState(D3DRS_LIGHTING,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,FALSE); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR ); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); m_D3Device->SetVertexShader(D3DFVF_XYZ); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_NONE); for( i = 0; i < m_iLeafsNum; i++ ) { if(iLeafIndex == i) { D3DXMATRIX identity; D3DXMatrixIdentity(&identity); m_D3Device->SetTransform(D3DTS_WORLD,&identity); D3DXVECTOR3 vecMinBox = D3DXVECTOR3((float)m_pLeafExs[i].m_vecMinBox[0], (float)m_pLeafExs[i].m_vecMinBox[1], (float)m_pLeafExs[i].m_vecMinBox[2]); D3DXVECTOR3 vecMaxBox = D3DXVECTOR3((float)m_pLeafExs[i].m_vecMaxBox[0], (float)m_pLeafExs[i].m_vecMaxBox[1], (float)m_pLeafExs[i].m_vecMaxBox[2]); SetBox(vecMinBox,vecMaxBox); /* if(iLeafIndex == i) {*/ CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xffffff00); CSceneStateMgr::_SetD3DRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME); /* } else { CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xff00ffff); CSceneStateMgr::_SetD3DRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME); }*/ m_D3Device->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0,8,12,g_vecCubeIndex,D3DFMT_INDEX16,g_vecCube,sizeof(D3DXVECTOR3)); } } CSceneStateMgr::_SetD3DRenderState(D3DRS_FILLMODE,D3DFILL_SOLID); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW); CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE,TRUE); } void RBspScene::RenderBspScene() { int i,j; int iSize; int iRenderCount = 0; // RenderShadowMap(); if(m_iShaderVersion == RBSPSHADER_GF3) { /* WBGraphicLayer::GetDevice()->SetTextureStageState(0,D3DTSS_MAGFILTER,D3DTEXF_LINEAR); WBGraphicLayer::GetDevice()->SetTextureStageState(0,D3DTSS_MINFILTER,D3DTEXF_LINEAR); WBGraphicLayer::GetDevice()->SetTextureStageState(0,D3DTSS_MIPFILTER,D3DTEXF_LINEAR); WBGraphicLayer::GetDevice()->SetTextureStageState(1,D3DTSS_MAGFILTER,D3DTEXF_LINEAR); WBGraphicLayer::GetDevice()->SetTextureStageState(1,D3DTSS_MINFILTER,D3DTEXF_LINEAR); WBGraphicLayer::GetDevice()->SetTextureStageState(1,D3DTSS_MIPFILTER,D3DTEXF_LINEAR); WBGraphicLayer::GetDevice()->SetTextureStageState(3,D3DTSS_MAGFILTER,D3DTEXF_LINEAR); WBGraphicLayer::GetDevice()->SetTextureStageState(3,D3DTSS_MINFILTER,D3DTEXF_LINEAR); WBGraphicLayer::GetDevice()->SetTextureStageState(3,D3DTSS_MIPFILTER,D3DTEXF_LINEAR); // Base texture stage WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP); WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP); WBGraphicLayer::GetDevice()->SetRenderState( D3DRS_WRAP0, 0 ); // bump map texture stage WBGraphicLayer::GetDevice()->SetTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP); WBGraphicLayer::GetDevice()->SetTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP); WBGraphicLayer::GetDevice()->SetRenderState( D3DRS_WRAP1, 0 ); // Illumination texture WBGraphicLayer::GetDevice()->SetTextureStageState(2, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); WBGraphicLayer::GetDevice()->SetTextureStageState(2, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); WBGraphicLayer::GetDevice()->SetTextureStageState(2, D3DTSS_ADDRESSW, D3DTADDRESS_CLAMP); WBGraphicLayer::GetDevice()->SetRenderState( D3DRS_WRAP2, 0); WBGraphicLayer::GetDevice()->SetTextureStageState(3, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); WBGraphicLayer::GetDevice()->SetTextureStageState(3, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); WBGraphicLayer::GetDevice()->SetTextureStageState(3, D3DTSS_ADDRESSW, D3DTADDRESS_CLAMP); // One Pass for( i = 0; i < m_iTextureDefsNum; i++ ) { if(m_pBaseVertexUseNum[i] > 0) { m_pShader->SetTexture(&(m_pTextures[i]),&(m_pNTextures[i])); m_pShader->Apply(); WBGraphicLayer::GetDevice()->SetStreamSource(0,m_pBaseVertexBuffer[i],sizeof(WBDotVertex)); WBGraphicLayer::GetDevice()->SetIndices(m_pBaseIndexBuffer[i],0); iSize = m_pLightUnit[i].size(); for(j=0;j < iSize;j++) { if(j != (iSize - 1)) { WBGraphicLayer::GetDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, m_pLightUnit[i][j].m_iStartVertIndex,(m_pLightUnit[i][j+1].m_iStartVertIndex - m_pLightUnit[i][j].m_iStartVertIndex), m_pLightUnit[i][j].m_iStartIndex, ((m_pLightUnit[i][j+1].m_iStartIndex - m_pLightUnit[i][j].m_iStartIndex)/ 3)); iRenderCount++; } else { WBGraphicLayer::GetDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, m_pLightUnit[i][j].m_iStartVertIndex,(m_pBaseVertexUseNum[i] - m_pLightUnit[i][j].m_iStartVertIndex), m_pLightUnit[i][j].m_iStartIndex, ((m_pBaseIndexUseNum[i] - m_pLightUnit[i][j].m_iStartIndex)/ 3)); iRenderCount++; } } } } WBGraphicLayer::GetDevice()->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE); WBGraphicLayer::GetDevice()->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO); WBGraphicLayer::GetDevice()->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_SRCCOLOR); // Two Pass (Light Map) for( i = 0; i < m_iTextureDefsNum; i++ ) { if(m_pBaseVertexUseNum[i] > 0) { WBGraphicLayer::GetDevice()->SetStreamSource(0,m_pLightVertexBuffer[i],sizeof(RBspLightVertex)); WBGraphicLayer::GetDevice()->SetIndices(m_pBaseIndexBuffer[i],0); iSize = m_pLightUnit[i].size(); for(j=0;j < iSize;j++) { if(m_pLightUnit[i][j].m_iLightId < 0) { // Lightmap ¾øÀ»¶§ m_pShadowShader->SetTexture(NULL); //m_pShadowShader->SetTexture(NULL,m_pDepthTexture); } else //m_pShadowShader->SetTexture(&(m_pLightTextures[m_pLightUnit[i][j].m_iLightId]),m_pColorTexture); m_pShadowShader->SetTexture(&(m_pLightTextures[m_pLightUnit[i][j].m_iLightId])); // Shadow Mapping m_pShadowShader->Apply(); if(j != (iSize - 1)) { WBGraphicLayer::GetDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, m_pLightUnit[i][j].m_iStartVertIndex,(m_pLightUnit[i][j+1].m_iStartVertIndex - m_pLightUnit[i][j].m_iStartVertIndex), m_pLightUnit[i][j].m_iStartIndex, ((m_pLightUnit[i][j+1].m_iStartIndex - m_pLightUnit[i][j].m_iStartIndex)/ 3)); iRenderCount++; } else { WBGraphicLayer::GetDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, m_pLightUnit[i][j].m_iStartVertIndex,(m_pBaseVertexUseNum[i] - m_pLightUnit[i][j].m_iStartVertIndex), m_pLightUnit[i][j].m_iStartIndex, ((m_pBaseIndexUseNum[i] - m_pLightUnit[i][j].m_iStartIndex)/ 3)); iRenderCount++; } } } } // tree pass (test pass : layer fog) WBGraphicLayer::GetDevice()->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); WBGraphicLayer::GetDevice()->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); //WBGraphicLayer::GetDevice()->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); //WBGraphicLayer::GetDevice()->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_BLENDTEXTUREALPHA); //WBGraphicLayer::GetDevice()->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE); WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT); WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_CURRENT ); WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_MIPFILTER, D3DTEXF_NONE); WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0); m_pFogShader->Apply(); for( i = 0; i < m_iTextureDefsNum; i++ ) { if(m_pBaseVertexUseNum[i] > 0) { WBGraphicLayer::GetDevice()->SetStreamSource(0,m_pLightVertexBuffer[i],sizeof(RBspLightVertex)); WBGraphicLayer::GetDevice()->SetIndices(m_pBaseIndexBuffer[i],0); iSize = m_pLightUnit[i].size(); for(j=0;j < iSize;j++) { if(j != (iSize - 1)) { WBGraphicLayer::GetDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, m_pLightUnit[i][j].m_iStartVertIndex,(m_pLightUnit[i][j+1].m_iStartVertIndex - m_pLightUnit[i][j].m_iStartVertIndex), m_pLightUnit[i][j].m_iStartIndex, ((m_pLightUnit[i][j+1].m_iStartIndex - m_pLightUnit[i][j].m_iStartIndex)/ 3)); iRenderCount++; } else { WBGraphicLayer::GetDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, m_pLightUnit[i][j].m_iStartVertIndex,(m_pBaseVertexUseNum[i] - m_pLightUnit[i][j].m_iStartVertIndex), m_pLightUnit[i][j].m_iStartIndex, ((m_pBaseIndexUseNum[i] - m_pLightUnit[i][j].m_iStartIndex)/ 3)); iRenderCount++; } } } } WBGraphicLayer::GetDevice()->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);*/ } else if(m_iShaderVersion == RBSPSHADER_GF2) { m_D3Device->SetVertexShader(dwRBSPUseFVF); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT); for( i = 0; i < m_iTextureDefsNum; i++ ) { if(m_pBaseVertexUseNum[i] > 0) { m_D3Device->SetTexture(0,m_pTextures[i].GetTexture()); m_D3Device->SetStreamSource(0,m_pBaseVertexBuffer[i],sizeof(RBspDrawVertex)); m_D3Device->SetIndices(m_pBaseIndexBuffer[i],0); iSize = m_pLightUnit[i].size(); for(j=0;j < iSize;j++) { if(m_pLightUnit[i][j].m_iLightId < 0) { // Lightmap ¾øÀ»¶§ m_D3Device->SetTexture(1,NULL); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); } else { m_D3Device->SetTexture(1,m_pLightTextures[m_pLightUnit[i][j].m_iLightId].GetTexture()); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE); } if(j != (iSize - 1)) { m_D3Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, m_pLightUnit[i][j].m_iStartVertIndex,(m_pLightUnit[i][j+1].m_iStartVertIndex - m_pLightUnit[i][j].m_iStartVertIndex), m_pLightUnit[i][j].m_iStartIndex, ((m_pLightUnit[i][j+1].m_iStartIndex - m_pLightUnit[i][j].m_iStartIndex)/ 3)); iRenderCount++; } else { m_D3Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, m_pLightUnit[i][j].m_iStartVertIndex,(m_pBaseVertexUseNum[i] - m_pLightUnit[i][j].m_iStartVertIndex), m_pLightUnit[i][j].m_iStartIndex, ((m_pBaseIndexUseNum[i] - m_pLightUnit[i][j].m_iStartIndex)/ 3)); iRenderCount++; } } } }// for RenderR3SObject(); } } // Return value : ÃÑ »ç¿ëµÈ light, Arg: PLight ´Â ¹è¿­, iLightNum Àº ¹è¿­ ¿ä¼Ò °¹¼ö int RBspScene::CheckChrLight(D3DXVECTOR3 vecPos,D3DLIGHT8 *pLight,int iLightNum) { D3DXVECTOR3 vecLocalPos = vecPos; D3DXMATRIX matTmp; D3DXMATRIX matInv; D3DXMatrixIdentity(&matTmp); matTmp._41 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.x; matTmp._42 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.y; matTmp._43 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.z; D3DXMatrixInverse(&matInv,NULL,&matTmp); D3DXMatrixIdentity(&matTmp); matTmp._41 = vecPos.x; matTmp._42 = vecPos.y; matTmp._43 = vecPos.z; D3DXMatrixMultiply(&matTmp,&matTmp,&matInv); vecLocalPos.x = matTmp._41; vecLocalPos.y = matTmp._42; vecLocalPos.z = matTmp._43; int iLeaf = FindLeafNode(vecLocalPos); RBspLeafEx *pLeafEx = &(m_pLeafExs[iLeaf]); return pLeafEx->CheckInChrLight(vecPos,pLight,iLightNum); } int RBspScene::RBspLeafEx::CheckInChrLight(D3DXVECTOR3 vecPos,D3DLIGHT8 *pLight,int iLightNum) { int i; float fMinLength = 0.0f; int iMinIndex = -1; int iInputNum = 0; for( i=0; i < m_iLightNum; i++ ) { D3DXVECTOR3 vecUnit = vecPos - m_lstLight[i].m_vecLight; float fLength = D3DXVec3Length(&vecUnit); if(fLength <= m_lstLight[i].m_vecLightRange.x) { if(iInputNum < iLightNum) { pLight[iInputNum] = m_lstLight[i].m_D3DLight; iInputNum++; } } } return iInputNum; } /* D3DLIGHT8 *RBspScene::RBspLeafEx::CheckInChrLight(D3DXVECTOR3 vecPos) { int i; float fMinLength = 0.0f; int iMinIndex = -1; for( i=0; i < m_iLightNum; i++ ) { D3DXVECTOR3 vecUnit = vecPos - m_lstLight[i].m_vecLight; float fLength = D3DXVec3Length(&vecUnit); if(fLength <= m_lstLight[i].m_vecLightRange.x) { if( iMinIndex == -1) { fMinLength = fLength; iMinIndex = i; } else if(fLength < fMinLength) { fMinLength = fLength; iMinIndex = i; } } } if(iMinIndex != -1) return &(m_lstLight[iMinIndex].m_D3DLight); return NULL; }*/ void RBspScene::RBspLeafEx::InputLight(int iLightValue,D3DXVECTOR3 vecLight,D3DXVECTOR3 vecRange,int iRed,int iGreen,int iBlue,bool bVolume,bool bMap) { // Local transform /* D3DXVECTOR3 vecLocalPos = vecLight; D3DXMATRIX matTmp; D3DXMATRIX matInv; D3DXMatrixIdentity(&matTmp); matTmp._41 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.x; matTmp._42 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.y; matTmp._43 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.z; D3DXMatrixInverse(&matInv,NULL,&matTmp); D3DXMatrixIdentity(&matTmp); matTmp._41 = vecLight.x; matTmp._42 = vecLight.y; matTmp._43 = vecLight.z; D3DXMatrixMultiply(&matTmp,&matTmp,&matInv); vecLocalPos.x = matTmp._41; vecLocalPos.y = matTmp._42; vecLocalPos.z = matTmp._43; // World ÁÂÇ¥ ¼¼ÆÃ vecLight = vecLocalPos;*/ // RBspLight PushNode; // Point Light or Directional Light PushNode.m_iLightValue = iLightValue; PushNode.m_vecLight = vecLight; PushNode.m_vecLightRange = vecRange; PushNode.m_fRed = (float)iRed / 255.0f; PushNode.m_fGreen = (float)iGreen / 255.0f; PushNode.m_fBlue = (float)iBlue / 255.0f; ZeroMemory(&(PushNode.m_D3DLight),sizeof(D3DLIGHT8)); PushNode.m_D3DLight.Type=D3DLIGHT_POINT; PushNode.m_D3DLight.Attenuation0=0.2f; PushNode.m_D3DLight.Attenuation1=0.005f; PushNode.m_D3DLight.Attenuation2=0.0f; PushNode.m_D3DLight.Diffuse.r = PushNode.m_fRed; PushNode.m_D3DLight.Diffuse.g = PushNode.m_fGreen; PushNode.m_D3DLight.Diffuse.b = PushNode.m_fBlue; PushNode.m_D3DLight.Position.x = PushNode.m_vecLight.x; PushNode.m_D3DLight.Position.y = PushNode.m_vecLight.y; PushNode.m_D3DLight.Position.z = PushNode.m_vecLight.z; PushNode.m_D3DLight.Range= PushNode.m_vecLightRange.x; PushNode.m_D3DLight.Falloff = 1.0f; m_lstLight.push_back(PushNode); if(bVolume) m_lstLight[m_iLightNum - 1].CreateShadowVolume(); if(bMap) m_lstLight[m_iLightNum - 1].CreateShadowMap(); m_iLightNum++; } void RBspScene::RBspLeafEx::DeleteAllTrigger() { m_lstTrigger.clear(); m_iTriggerNum = 0; } void RBspScene::RBspLeafEx::DeleteAllLight() { m_lstLight.clear(); m_iLightNum = 0; } void RBspScene::RBspLeafEx::DeleteLight(RBspScene::RBspLight *pLight) { int i; int iIndex = -1; if(pLight == NULL) return; for( i = 0; i < m_iLightNum; i++ ) { if((&m_lstLight[i]) == pLight) { iIndex = i; break; } } if(iIndex != -1) { m_lstLight.erase(&(m_lstLight[iIndex])); m_iLightNum--; } } void RBspScene::RBspLeafEx::DeleteTrigger(RBspScene::RBspTrigger *pTrigger) { int i; int iIndex = -1; if(pTrigger == NULL) return; for( i = 0; i < m_iTriggerNum; i++) { if((&m_lstTrigger[i]) == pTrigger) { iIndex = i; break; } } if(iIndex != -1) { m_lstTrigger.erase(&(m_lstTrigger[iIndex])); m_iTriggerNum--; } } void RBspScene::RBspLeafEx::DeleteLight(D3DXVECTOR3 vecLight) { int i; for( i = 0; i < m_iLightNum; i++) { if(((vecLight.x - m_lstLight[i].m_vecLight.x) + (vecLight.y - m_lstLight[i].m_vecLight.y) + (vecLight.z - m_lstLight[i].m_vecLight.z)) < RBSPEPS) // °°ÀºÁ¡ { m_lstLight.erase(&(m_lstLight[i])); m_iLightNum--; return; } } } void RBspScene::RBspLeafEx::DeleteTrigger(D3DXVECTOR3 vecCenter) { int i; for( i = 0; i < m_iTriggerNum; i++ ) { if(((vecCenter.x - m_lstTrigger[i].m_vecCenter.x) + (vecCenter.x - m_lstTrigger[i].m_vecCenter.x) + (vecCenter.x - m_lstTrigger[i].m_vecCenter.x)) < RBSPEPS) { m_lstTrigger.erase(&(m_lstTrigger[i])); m_iTriggerNum--; return; } } } void RBspScene::RBspLeafEx::MoveLight(D3DXVECTOR3 vecBeforePos,D3DXVECTOR3 vecNewPos) { int i; for( i = 0; i < m_iLightNum; i++) { if(((vecBeforePos.x - m_lstLight[i].m_vecLight.x) + (vecBeforePos.y - m_lstLight[i].m_vecLight.y) + (vecBeforePos.z - m_lstLight[i].m_vecLight.z)) < RBSPEPS) // °°ÀºÁ¡ { m_lstLight[i].m_vecLight = D3DXVECTOR3( vecNewPos.x, vecNewPos.y, vecNewPos.z); return; } } } int RBspScene::RBspLeafEx::InputEventSound(char *strName,D3DXVECTOR3 vecCenter,float fDelay) { m_iEventNum[ RBSPEVENT_SOUND]++; RBspEventSound *pNode = new RBspEventSound; strncpy(pNode->m_strName,strName,sizeof(char) * (RBSPBUF_SIZE - 1)); pNode->m_fDelay = fDelay; pNode->m_vecCenter = vecCenter; m_lstSound.push_back(pNode); return m_iEventNum[ RBSPEVENT_SOUND]; } void RBspScene::RBspLeafEx::DeletePickEventEffect() { if(m_pPickEventEffect == NULL) return; else { int i; for( i = 0; i < m_iEventNum[RBSPEVENT_EFFECT]; i++ ) { if(m_pPickEventEffect == m_lstEffect[i]) { delete m_lstEffect[i]; m_lstEffect[i] = NULL; m_iEventNum[RBSPEVENT_EFFECT]--; m_lstEffect.erase(&(m_lstEffect[i])); m_pPickEventEffect = NULL; break; } } } } void RBspScene::RBspLeafEx::DeletePickEventObject() { if(m_pPickEventObject == NULL) return; else { int i; for( i = 0; i < m_iEventNum[RBSPEVENT_OBJECTANI]; i++ ) { if(m_pPickEventObject == m_lstObject[i]) { delete m_lstObject[i]; m_lstObject[i] = NULL; m_iEventNum[RBSPEVENT_OBJECTANI]--; m_lstObject.erase(&(m_lstObject[i])); m_pPickEventObject = NULL; break; } } } } void RBspScene::RBspLeafEx::DeletePickEventSound() { if(m_pPickEventSound == NULL) return; else { int i; for( i = 0; i < m_iEventNum[RBSPEVENT_SOUND]; i++ ) { if(m_pPickEventSound == m_lstSound[i]) { delete m_lstSound[i]; m_lstSound[i] = NULL; m_iEventNum[RBSPEVENT_SOUND]--; m_lstSound.erase(&(m_lstSound[i])); m_pPickEventSound = NULL; break; } } } } void RBspScene::RBspLeafEx::DeletePickLight() { if(m_pPickLight == NULL) return; else { int i; for( i = 0; i < m_iLightNum; i++ ) { if(m_pPickLight == (&m_lstLight[i])) { m_lstLight.erase(&(m_lstLight[i])); m_iLightNum--; m_pPickLight = NULL; return; } } } } void RBspScene::RBspLeafEx::DeletePickTrigger() { if(m_pPickTrigger == NULL) return; else { int i; for( i = 0 ; i < m_iTriggerNum; i++ ) { if(m_pPickTrigger == (&m_lstTrigger[i])) { m_lstTrigger.erase(&(m_lstTrigger[i])); m_iTriggerNum--; m_pPickTrigger = NULL; return; } } } } void RBspScene::RBspLeafEx::DeletePickR3SObject() { if(m_pPickR3SObject == NULL) return; else { int i; for( i = 0; i < m_iR3SObjectNum; i++ ) { if(m_pPickR3SObject == m_lstR3SObject[i]) { delete (m_lstR3SObject[i]); m_lstR3SObject[i] = NULL; m_lstR3SObject.erase(&(m_lstR3SObject[i])); m_iR3SObjectNum--; return; } } } } void RBspScene::RBspLeafEx::DeleteEventSound(D3DXVECTOR3 vecCenter) { int i; for( i = 0; i < m_iEventNum[ RBSPEVENT_SOUND ]; i++) { if(((vecCenter.x - m_lstSound[i]->m_vecCenter.x) + (vecCenter.y - m_lstSound[i]->m_vecCenter.y) + (vecCenter.z - m_lstSound[i]->m_vecCenter.z)) < RBSPEPS) { delete m_lstSound[i]; m_lstSound.erase(&(m_lstSound[i])); m_iEventNum[ RBSPEVENT_SOUND ]--; return; } } } void RBspScene::RBspLeafEx::MoveEventSound(D3DXVECTOR3 vecCenter,D3DXVECTOR3 vecEndPos) { int i; for( i = 0; i < m_iEventNum[ RBSPEVENT_SOUND ]; i++ ) { if(((vecCenter.x - m_lstSound[i]->m_vecCenter.x) + (vecCenter.y - m_lstSound[i]->m_vecCenter.y) + (vecCenter.z - m_lstSound[i]->m_vecCenter.z)) < RBSPEPS) { m_lstSound[i]->m_vecCenter = vecEndPos; return; } } } // R3S Object Input int RBspScene::RBspLeafEx::InputR3SObject(float fX,float fY,float fZ,char *strName,matrix matTm,bool bAlpha,bool bLight) { RBspR3S *pNode = new RBspR3S; pNode->m_vecPos = vector3(fX,fY,fZ); strcpy((pNode->m_strName),strName); pNode->m_matTm = matTm; pNode->m_bAlpha = bAlpha; pNode->m_bLight = bLight; m_lstR3SObject.push_back(pNode); m_iR3SObjectNum++; return m_iR3SObjectNum; } int RBspScene::RBspLeafEx::InputEventEffect(char *strName,D3DXVECTOR3 vecCenter,float fDelay) { // Local transform /* D3DXVECTOR3 vecLocalPos = vecCenter; D3DXMATRIX matTmp; D3DXMATRIX matInv; D3DXMatrixIdentity(&matTmp); matTmp._41 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.x; matTmp._42 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.y; matTmp._43 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.z; D3DXMatrixInverse(&matInv,NULL,&matTmp); D3DXMatrixIdentity(&matTmp); matTmp._41 = vecCenter.x; matTmp._42 = vecCenter.y; matTmp._43 = vecCenter.z; D3DXMatrixMultiply(&matTmp,&matTmp,&matInv); vecLocalPos.x = matTmp._41; vecLocalPos.y = matTmp._42; vecLocalPos.z = matTmp._43; vecCenter = vecLocalPos; */ // m_iEventNum[ RBSPEVENT_EFFECT]++; RBspEventEffect *pNode = new RBspEventEffect; strncpy(pNode->m_strName,strName,sizeof(char) * (RBSPBUF_SIZE - 1)); pNode->m_fDelay = fDelay; pNode->m_vecCenter = vecCenter; m_lstEffect.push_back(pNode); return m_iEventNum[ RBSPEVENT_EFFECT]; } void RBspScene::RBspLeafEx::DeleteEventEffect(D3DXVECTOR3 vecCenter) { int i; for( i = 0; i < m_iEventNum[ RBSPEVENT_EFFECT ]; i++) { if(((vecCenter.x - m_lstEffect[i]->m_vecCenter.x) + (vecCenter.y - m_lstEffect[i]->m_vecCenter.y) + (vecCenter.z - m_lstEffect[i]->m_vecCenter.z)) < RBSPEPS) { delete m_lstEffect[i]; m_lstEffect.erase(&(m_lstEffect[i])); m_iEventNum[ RBSPEVENT_EFFECT ]--; return; } } } void RBspScene::RBspLeafEx::MoveEventEffect(D3DXVECTOR3 vecCenter,D3DXVECTOR3 vecEndPos) { int i; for( i = 0; i < m_iEventNum[ RBSPEVENT_EFFECT ]; i++ ) { if(((vecCenter.x - m_lstEffect[i]->m_vecCenter.x) + (vecCenter.y - m_lstEffect[i]->m_vecCenter.y) + (vecCenter.z - m_lstEffect[i]->m_vecCenter.z)) < RBSPEPS) { m_lstEffect[i]->m_vecCenter = vecEndPos; return; } } } int RBspScene::RBspLeafEx::InputEventObject(RAniObject *pObject,int iLoop,float fDelay) { m_iEventNum[ RBSPEVENT_OBJECTANI]++; RBspEventObject *pNode = new RBspEventObject; pNode->m_fDelay = fDelay; pNode->m_iLoopNum = iLoop; pNode->m_lstAniObject.push_back(pObject); m_lstObject.push_back(pNode); return m_iEventNum[ RBSPEVENT_OBJECTANI]; } void RBspScene::RBspLeafEx::DeleteEventObject(RAniObject *pObject) { int i; for( i = 0; i < m_iEventNum[ RBSPEVENT_OBJECTANI]; i++ ) { if(m_lstObject[i]->m_lstAniObject[0] == pObject) { delete m_lstObject[i]; m_lstObject.erase(&(m_lstObject[i])); m_iEventNum[ RBSPEVENT_OBJECTANI]--; return; } } } void RBspScene::RBspLeafEx::MoveEventObject(RAniObject *pObject,D3DXVECTOR3 vecLocalMove) // »ó´ëÀûÀÎ À̵¿°ª { int i; for( i = 0; i < m_iEventNum[ RBSPEVENT_OBJECTANI]; i++ ) { if(m_lstObject[i]->m_lstAniObject[0] == pObject) { // RAniObject °´Ã¼ move // m_lstObject[i]->m_lstAniObject[0]->Move(vecLocalMove); return; } } } void RBspScene::RBspLeafEx::DeleteEventEffect(RBspEventEffect *pEffect) { int i; for( i = 0; i < m_iEventNum[ RBSPEVENT_EFFECT ]; i++ ) { if(m_lstEffect[i] == pEffect) { delete m_lstEffect[i]; m_lstEffect[i] = NULL; m_lstEffect.erase(&(m_lstEffect[i])); m_iEventNum[ RBSPEVENT_EFFECT ]--; break; } } } void RBspScene::RBspLeafEx::DeleteEventSound(RBspEventSound *pSound) { int i; for( i = 0; i < m_iEventNum[ RBSPEVENT_SOUND ]; i++ ) { if(m_lstSound[i] == pSound) { delete m_lstSound[i]; m_lstSound[i] = NULL; m_lstSound.erase(&(m_lstSound[i])); m_iEventNum[ RBSPEVENT_SOUND ]--; break; } } } void RBspScene::RBspLeafEx::DeleteEventObject(RBspEventObject *pObject) { int i; for( i = 0; i < m_iEventNum[ RBSPEVENT_OBJECTANI ]; i++ ) { delete m_lstObject[i]; m_lstObject[i] = NULL; m_lstObject.erase(&(m_lstObject[i])); m_iEventNum[ RBSPEVENT_OBJECTANI ]--; break; } } // Picking void RBspScene::RBspLeafEx::PickR3SObject(D3DXVECTOR3 vecPos) { int i; float fMinLength = 0.0f; int iPickIndex = -1; for( i = 0; i < m_iR3SObjectNum; i++ ) { D3DXVECTOR3 vecObject = D3DXVECTOR3(m_lstR3SObject[i]->m_vecPos.x,m_lstR3SObject[i]->m_vecPos.y,m_lstR3SObject[i]->m_vecPos.z); D3DXVECTOR3 vecTmp = vecObject - vecPos; float fTmp = D3DXVec3Length(&vecTmp); if(i == 0) { fMinLength = fTmp; iPickIndex = i; } else if(fMinLength > fTmp) { fMinLength = fTmp; iPickIndex = i; } } if(iPickIndex == -1) m_pPickR3SObject = NULL; else { m_pPickR3SObject = m_lstR3SObject[iPickIndex]; m_lstR3SObject[iPickIndex]->m_iPickState = RBSPPICK_PICKED; } } void RBspScene::RBspLeafEx::PickLight(D3DXVECTOR3 vecPos) { int i; float fMinLength = 0.0f; int iPickIndex = -1; for( i = 0; i < m_iLightNum; i++ ) { D3DXVECTOR3 vecTmp = m_lstLight[i].m_vecLight - vecPos; float fTmp = D3DXVec3Length(&vecTmp); if(i == 0) { fMinLength = fTmp; iPickIndex = i; } else if(fMinLength > fTmp) { fMinLength = fTmp; iPickIndex = i; } } if(iPickIndex == -1) m_pPickLight = NULL; else { m_pPickLight = &m_lstLight[iPickIndex]; m_pPickLight->m_iPickState = RBSPPICK_PICKED; } } void RBspScene::RBspLeafEx::PickTrigger(D3DXVECTOR3 vecPos) { int i; float fMinLength = 0.0f; int iPickIndex = -1; for( i = 0; i < m_iTriggerNum; i++ ) { D3DXVECTOR3 vecTmp = m_lstTrigger[i].m_vecCenter - vecPos; float fTmp = D3DXVec3Length(&vecTmp); if(i == 0) { fMinLength = fTmp; iPickIndex = i; } else if(fMinLength > fTmp) { fMinLength = fTmp; iPickIndex = i; } } if(iPickIndex == -1) m_pPickTrigger = NULL; else { m_pPickTrigger = &m_lstTrigger[iPickIndex]; m_pPickTrigger->m_iPickState = RBSPPICK_PICKED; } } void RBspScene::RBspLeafEx::PickEventEffect(D3DXVECTOR3 vecPos) { int i; float fMinLength = 0.0f; int iPickIndex = -1; for( i = 0; i < m_iEventNum[ RBSPEVENT_EFFECT ]; i++) { D3DXVECTOR3 vecTmp = m_lstEffect[i]->m_vecCenter - vecPos; float fTmp = D3DXVec3Length(&vecTmp); if( i == 0 ) { fMinLength = fTmp; iPickIndex = i; } else if(fMinLength > fTmp) { fMinLength = fTmp; iPickIndex = i; } } if(iPickIndex == -1) m_pPickEventEffect = NULL; else { m_pPickEventEffect = m_lstEffect[iPickIndex]; m_pPickEventEffect->m_iPickState = RBSPPICK_PICKED; } } void RBspScene::RBspLeafEx::PickEventSound(D3DXVECTOR3 vecPos) { int i; float fMinLength = 0.0f; int iPickIndex = -1; for( i = 0; i < m_iEventNum[ RBSPEVENT_SOUND ]; i++ ) { D3DXVECTOR3 vecTmp = m_lstSound[i]->m_vecCenter - vecPos; float fTmp = D3DXVec3Length(&vecTmp); if( i == 0 ) { fMinLength = fTmp; iPickIndex = i; } else if( fMinLength > fTmp) { fMinLength = fTmp; iPickIndex = i; } } if(iPickIndex == -1) m_pPickEventSound = NULL; else { m_pPickEventSound = m_lstSound[iPickIndex]; m_pPickEventSound->m_iPickState = RBSPPICK_PICKED; } } void RBspScene::RBspLeafEx::PickEventObject(D3DXVECTOR3 vecPos) { int i; float fMinLength = 0.0f; int iPickIndex = -1; for( i = 0; i < m_iEventNum[ RBSPEVENT_OBJECTANI ]; i++ ) { D3DXVECTOR3 vecTmp = m_lstObject[i]->m_vecCenter - vecPos; float fTmp = D3DXVec3Length(&vecTmp); if( i == 0 ) { fMinLength = fTmp; iPickIndex = i; } else if( fMinLength > fTmp) { fMinLength = fTmp; iPickIndex = i; } } if(iPickIndex == -1) m_pPickEventObject = NULL; else { m_pPickEventObject = m_lstObject[iPickIndex]; m_pPickEventObject->m_iPickState = RBSPPICK_PICKED; } } void RBspScene::RBspLeafEx::UnPickLight() { int i; m_pPickLight = NULL; for( i = 0; i < m_iLightNum; i++ ) { m_lstLight[i].m_iPickState = RBSPPICK_READY; } } void RBspScene::RBspLeafEx::UnPickTrigger() { int i; m_pPickTrigger = NULL; for( i = 0; i < m_iTriggerNum; i++ ) { m_lstTrigger[i].m_iPickState = RBSPPICK_READY; } } void RBspScene::RBspLeafEx::UnPickEventEffect() { int i; m_pPickEventEffect = NULL; for( i = 0; i < m_iEventNum[RBSPEVENT_EFFECT]; i++ ) { m_lstEffect[i]->m_iPickState = RBSPPICK_READY; } } void RBspScene::RBspLeafEx::UnPickEventSound() { int i; m_pPickEventObject = NULL; for( i = 0; i < m_iEventNum[RBSPEVENT_SOUND]; i++ ) { m_lstSound[i]->m_iPickState = RBSPPICK_READY; } } void RBspScene::RBspLeafEx::UnPickEventObject() { int i; m_pPickEventObject = NULL; for( i = 0; i < m_iEventNum[RBSPEVENT_OBJECTANI]; i++ ) { m_lstObject[i]->m_iPickState = RBSPPICK_READY; } } void RBspScene::RBspLeafEx::UnPickR3SObject() { int i; m_pPickR3SObject = NULL; for( i = 0; i < m_iR3SObjectNum; i++ ) { m_lstR3SObject[i]->m_iPickState = RBSPPICK_READY; } } void RBspScene::RBspLeafEx::MovePickLight(D3DXVECTOR3 vecNewPos) { if(m_pPickLight != NULL) m_pPickLight->m_vecLight = vecNewPos; } void RBspScene::RBspLeafEx::MovePickTrigger(D3DXVECTOR3 vecNewPos) { if(m_pPickTrigger != NULL) m_pPickTrigger->m_vecCenter = vecNewPos; } void RBspScene::RBspLeafEx::PickTriggerEdit(D3DXVECTOR3 vecCenter,int iTriggerValue,D3DXVECTOR3 vecTrigger[2]) { if(m_pPickTrigger != NULL) { m_pPickTrigger->m_vecCenter = vecCenter; m_pPickTrigger->m_iTriggerValue = iTriggerValue; m_pPickTrigger->m_vecTrigger[0] = vecTrigger[0]; m_pPickTrigger->m_vecTrigger[1] = vecTrigger[1]; } } void RBspScene::RBspLeafEx::MovePickEventEffect(D3DXVECTOR3 vecNewPos) { if(m_pPickEventEffect != NULL) m_pPickEventEffect->m_vecCenter = vecNewPos; } void RBspScene::RBspLeafEx::MovePickEvnetSound(D3DXVECTOR3 vecNewPos) { if(m_pPickEventSound != NULL) m_pPickEventSound->m_vecCenter = vecNewPos; } void RBspScene::RBspLeafEx::MovePickEvnetObject(D3DXVECTOR3 vecNewPos) { if(m_pPickEventObject != NULL) m_pPickEventObject->m_vecCenter = vecNewPos; } // Trigger void RBspScene::RBspLeafEx::CreateEmptyTrigger(D3DXVECTOR3 vecCenter,int iTriggerValue,D3DXVECTOR3 vecTrigger[2]) { RBspTrigger Node; Node.m_vecCenter = vecCenter; // Trigger Center Node.m_iTriggerValue = iTriggerValue; // Trigger Á¾·ù ( 0 : Sphere, 1 : Box ) Node.m_vecTrigger[0] = vecTrigger[0]; // Trigger Á¾·ù¿¡ µû¸¥ °æ°è°ª Node.m_vecTrigger[1] = vecTrigger[1]; // (Sphere : 0 -> Center, 1 -> Range ) // (Box : 0 -> Center, 1 -> Min, Max Value) m_lstTrigger.push_back(Node); m_iTriggerNum++; m_pPickTrigger = &(m_lstTrigger[m_iTriggerNum - 1]); // Ãß°¡µÈÈÄ¿¡ Pick Trigger·Î ¼¼ÆÃÇÏ¿© ´ÙÀ½ÀÛ¾÷ ¼öÇà°¡´ÉÇϰÔ. } void RBspScene::RBspLeafEx::PickTriggerInputEffect(RBspEventEffect *pEffect) { if(m_pPickTrigger == NULL || pEffect == NULL) return; m_pPickTrigger->InputEventEffect(pEffect); // Link Ç¥½Ã pEffect->m_bLinked = true; } void RBspScene::RBspLeafEx::PickTriggerInputObject(RBspEventObject *pObject) { if(m_pPickTrigger == NULL || pObject == NULL) return; m_pPickTrigger->InputEventObject(pObject); // Link Ç¥½Ã pObject->m_bLinked = true; } void RBspScene::RBspLeafEx::PickTriggerInputSound(RBspEventSound *pSound) { if(m_pPickTrigger == NULL || pSound == NULL) return; m_pPickTrigger->InputEventSound(pSound); // Link Ç¥½Ã pSound->m_bLinked = true; } // /* void RBspScene::RBspLight::InputShadowVolume(RShadowVolumeObject Object) { if(!m_bShadowVolume) CreateShadowVolume(); RShadowVolumeEdge *pEdges = new RShadowVolumeEdge; pEdges->CreateEdgeFromObject(D3DXVECTOR3(0.0f,1.0f,0.0f),&Object,2); m_pShadowVolume->InputVolume(pEdges); }*/ void RBspScene::RBspLight::RenderShadowVolume() { if(!m_bShadowVolume) return; if(m_pShadowVolume == NULL) { m_bShadowVolume = false; return; } // Render Stencil Buffer( È­¸é¿¡ Masking ¸¶Áö¸·¿¡ Çѹø ÇØÁØ´Ù) // m_pShadowVolume->RenderStencil(); } void RBspScene::RBspLight::InputShadowMap() { } int RBspScene::RBspTrigger::InputEventEffect(RBspEventEffect *pEffect) { m_iEventNum[RBSPEVENT_EFFECT]++; m_lstEffect.push_back(pEffect); return m_iEventNum[RBSPEVENT_EFFECT]; } int RBspScene::RBspTrigger::InputEventSound(RBspEventSound *pSound) { m_iEventNum[RBSPEVENT_SOUND]++; m_lstSound.push_back(pSound); return m_iEventNum[RBSPEVENT_SOUND]; } int RBspScene::RBspTrigger::InputEventObject(RBspEventObject *pObject) { m_iEventNum[ RBSPEVENT_OBJECTANI ]++; m_lstObject.push_back(pObject); return m_iEventNum[ RBSPEVENT_OBJECTANI]; } // vecPos°¡ trigger ¾È¿¡ ÀÖ´Ù¸é true return bool RBspScene::RBspTrigger::CheckInTrigger(D3DXVECTOR3 vecPos) { vecPos -= m_vecCenter; if(m_iTriggerValue == RBSPTRIGGER_SPHERE) // Sphere { D3DXVECTOR3 vecTmp = vecPos - m_vecTrigger[0]; // m_vecTrigger[0] : Sphere Center Pos float fRange = D3DXVec3Length(&vecTmp); if(fRange <= m_vecTrigger[1].x) { // m_vecTrigger[1].x == m_vecTrigger[1].y == m_vecTrigger[1].z == Sphere Radius m_bPlay = true; Play(); return true; } } else if(m_iTriggerValue == RBSPTRIGGER_BOX) // Box { // m_vecTrigger[0] : Min Box, m_vecTrigger[1] : Max Box if((vecPos.x >= m_vecTrigger[0].x) && (vecPos.y >= m_vecTrigger[0].y) && (vecPos.z >= m_vecTrigger[0].z) && (vecPos.x <= m_vecTrigger[1].x) && (vecPos.y <= m_vecTrigger[1].y) && (vecPos.z <= m_vecTrigger[1].z)) { m_bPlay = true; Play(); return true; } } m_bPlay = false; return false; } // Trigger µ¿À۽ÿ¡ Æ®¸®°Å¿¡ ¿¬°áµÈ Eventµé µ¿ÀÛ func // Delay³ª ´Ù¸¥ ¼¼ºÎ µ¿ÀÛÁ¦¾î´Â °¢±âÀÇ event class ³»ºÎ¿¡¼­ ÀÌ·ç¾îÁø´Ù. void RBspScene::RBspTrigger::Play() { if(m_bPlay == true) { int i; for( i = 0; i < m_iEventNum[RBSPEVENT_EFFECT]; i++) { // Effect m_lstEffect[i]->Play(); } for( i = 0; i < m_iEventNum[RBSPEVENT_SOUND]; i++) { // Sound m_lstSound[i]->Play(); } for( i = 0; i < m_iEventNum[RBSPEVENT_OBJECTANI]; i++) {// Object Ani m_lstObject[i]->Play(); } } } void RBspScene::RBspEventEffect::Play() // Effect Play Func { if(m_bPlay == false) { m_bPlay = true; m_dwStartTime = timeGetTime(); } else{ // start µÈµÚ m_dwCurrentTime = timeGetTime(); if((m_dwCurrentTime - m_dwStartTime) / 30 > (DWORD)m_fDelay) Start(); } } void RBspScene::RBspEventObject::Play() // Ani Object Play Func { if(m_bPlay == false) { m_bPlay = true; m_dwStartTime = timeGetTime(); } else{ m_dwCurrentTime = timeGetTime(); if((m_dwCurrentTime - m_dwStartTime) / 30 > (DWORD)m_fDelay) Start(); } } void RBspScene::RBspEventSound::Play() // Sound Play Func { if(m_bPlay == false) { m_bPlay = true; m_dwStartTime = timeGetTime(); } else{ m_dwCurrentTime = timeGetTime(); if((m_dwCurrentTime - m_dwStartTime) / 30 > (DWORD)m_fDelay) Start(); } } void RBspScene::RBspEventEffect::Start() //½ÇÁ¦ÀûÀÎ ÀÛµ¿ { m_bStart = true; } void RBspScene::RBspEventObject::Start() //½ÇÁ¦ÀûÀÎ ÀÛµ¿ { m_bStart = true; } void RBspScene::RBspEventSound::Start() //½ÇÁ¦ÀûÀÎ ÀÛµ¿ { m_bStart = true; } void RBspScene::UpdateLeafBox(float x,float y,float z) { int i; for( i = 0; i < m_iLeafsNum; i++) { m_pLeafExs[i].m_vecMinBox[0] += x; m_pLeafExs[i].m_vecMinBox[1] += y; m_pLeafExs[i].m_vecMinBox[2] += z; // Max m_pLeafExs[i].m_vecMaxBox[0] += x; m_pLeafExs[i].m_vecMaxBox[1] += y; m_pLeafExs[i].m_vecMaxBox[2] += z; } } void RBspScene::SetZeroPosition(float x,float y,float z) { int i; m_vecZeroPos = vector3(x,y,z); m_bVisible = true; for( i = 0; i < m_iLeafsNum; i++) { D3DXMATRIX box; D3DXMATRIX axis; // Min D3DXMatrixIdentity(&box); D3DXMatrixIdentity(&axis); axis._41 = m_vecZeroPos.x; axis._42 = m_vecZeroPos.y; axis._43 = m_vecZeroPos.z; box._41 = m_pLeafExs[i].m_vecMinBox[0]; box._42 = m_pLeafExs[i].m_vecMinBox[1]; box._43 = m_pLeafExs[i].m_vecMinBox[2]; D3DXMatrixMultiply(&box,&box,&axis); m_pLeafExs[i].m_vecMinBox[0] = box._41; m_pLeafExs[i].m_vecMinBox[1] = box._42; m_pLeafExs[i].m_vecMinBox[2] = box._43; // Max D3DXMatrixIdentity(&box); box._41 = m_pLeafExs[i].m_vecMaxBox[0]; box._42 = m_pLeafExs[i].m_vecMaxBox[1]; box._43 = m_pLeafExs[i].m_vecMaxBox[2]; D3DXMatrixMultiply(&box,&box,&axis); m_pLeafExs[i].m_vecMaxBox[0] = box._41; m_pLeafExs[i].m_vecMaxBox[1] = box._42; m_pLeafExs[i].m_vecMaxBox[2] = box._43; } } void RBspScene::RenderBox(vector3 vecAxis,vector3 vecScale,bool bTarget) { D3DXMATRIX identity; D3DXMatrixIdentity(&identity); identity._41 = vecAxis.x; identity._42 = vecAxis.y; identity._43 = vecAxis.z; identity._11 = vecScale.x; identity._22 = vecScale.y; identity._33 = vecScale.z; CSceneStateMgr::_SetD3DRenderState(D3DRS_LIGHTING,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,FALSE); if(bTarget == false) CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xff0000ff); else CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xffffff00); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR ); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); m_D3Device->SetTransform(D3DTS_WORLD,&identity); m_D3Device->SetVertexShader(D3DFVF_XYZ); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_NONE); CSceneStateMgr::_SetD3DRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME); m_D3Device->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0,8,12,g_vecCubeIndex,D3DFMT_INDEX16,g_vecCube,sizeof(D3DXVECTOR3)); CSceneStateMgr::_SetD3DRenderState(D3DRS_FILLMODE,D3DFILL_SOLID); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW); CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,TRUE); } void RBspScene::RenderScene(bool bBspIn,bool bTarget) { if(m_bVisible) { if(bBspIn) { CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,FALSE); D3DXMATRIX identity; D3DXMatrixIdentity(&identity); identity._41 = m_vecZeroPos.x; identity._42 = m_vecZeroPos.y; identity._43 = m_vecZeroPos.z; /* identity._11 = vecScale.x; identity._22 = vecScale.y; identity._33 = vecScale.z; */ m_D3Device->SetTransform(D3DTS_WORLD,&identity); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE); /* CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); */ RenderBspScene(); } else // ³»ºÎ¿¡ ÀÖ´Â bsp°¡ ¾Æ´Ï´Ù { SetBox(D3DXVECTOR3(-50.0f,-50.0f,-50.0f),D3DXVECTOR3(50.0f,50.0f,50.0f)); //»óÀÚÇ¥½Ã RenderBox(m_vecZeroPos,vector3(10.0f,10.0f,10.0f),bTarget); } } } bool RBspScene::LoadBseScene(const char *strFilename,float fx,float fy,float fz) // Read Bsp Extension File { int i,j; SetBspScale(fx,fy,fz); char strBuf[RBSPBUF_SIZE] = {0}; FILE *fp = NULL; fp = fopen(strFilename,"rb"); if(fp == NULL) { MessageBox(NULL,"File Load Failed",strFilename,MB_OK); return false; } else { fread((char *)strBuf,sizeof(char) * RBSPBUF_SIZE,1,fp); if(strcmp(strBuf,"BseFile")) { fclose(fp); MessageBox(NULL,"Not Bse File",strBuf,MB_OK); return false; } else strcpy(m_strBspName,strFilename); // Data Num Read int arrNum[11]; fread((int *)arrNum,sizeof(int),11,fp); m_iVertsNum = arrNum[0]; m_iFacesNum = arrNum[1]; m_iTextureDefsNum = arrNum[2]; m_iLightMapsNum = arrNum[3]; m_iNodesNum = arrNum[4]; m_iLeafsNum = arrNum[5]; m_iLeafFacesNum = arrNum[6]; m_iPlanesNum = arrNum[7]; m_iBrushesNum = arrNum[8]; m_iBrusheSidesNum = arrNum[9]; m_iLeafBrushesNum = arrNum[10]; m_pVerts = new RBspDrawVertex[m_iVertsNum]; m_pFaces = new RBspFace[m_iFacesNum]; m_pTextureDefs = new RBspTextureDef[ m_iTextureDefsNum ]; m_pLightMaps = new RBspLightMap[ m_iLightMapsNum ]; m_pLightTextures = new CTexture[ m_iLightMapsNum ]; m_pNodes = new RBspNode[ m_iNodesNum ]; m_pLeafExs = new RBspLeafEx[ m_iLeafsNum ]; m_pLeafFaces = new int[ m_iLeafFacesNum ]; m_pPlanes = new RBspPlane[ m_iPlanesNum ]; m_pTextures = new CTexture[ m_iTextureDefsNum ]; m_pBrushes = new RBspBrushe[ m_iBrushesNum ]; m_pBrusheSides = new RBspBrusheSide[ m_iBrusheSidesNum ]; m_pLeafBrushes = new int[ m_iLeafBrushesNum ]; // Base Texture Buffer Create m_pBaseVertexBuffer = new LPDIRECT3DVERTEXBUFFER8[m_iTextureDefsNum]; //m_pLightVertexBuffer = new LPDIRECT3DVERTEXBUFFER8[m_iTextureDefsNum]; m_pBaseVertexNum = new int[m_iTextureDefsNum]; m_pBaseVertexUseNum = new int[m_iTextureDefsNum]; m_pBaseIndexBuffer = new LPDIRECT3DINDEXBUFFER8[m_iTextureDefsNum]; m_pBaseIndexNum = new int[m_iTextureDefsNum]; m_pBaseIndexUseNum = new int[m_iTextureDefsNum]; m_pLightUnit = new LightUnitType[m_iTextureDefsNum]; // Vis data Load fread((int *)&(m_VisData.m_iBytesPerCluster),sizeof(int),1,fp); fread((int *)&(m_VisData.m_iClustersNum),sizeof(int),1,fp); int iAllocSize = 0; fread((int *)&iAllocSize,sizeof(int),1,fp); m_VisData.m_pBitsets = new byte[iAllocSize]; fread((byte *)m_VisData.m_pBitsets,sizeof(byte),iAllocSize,fp); // face Read fread((RBspFace *)m_pFaces,sizeof(RBspFace),m_iFacesNum,fp); // Texture Define Read fread((RBspTextureDef *)m_pTextureDefs,sizeof(RBspTextureDef),m_iTextureDefsNum,fp); // LightMap Read fread((RBspLightMap *)m_pLightMaps,sizeof(RBspLightMap),m_iLightMapsNum,fp); //////////////////// for(i = 0; i < m_iTextureDefsNum; i++ ) { m_pBaseVertexBuffer[i] = NULL; //m_pLightVertexBuffer[i] = NULL; m_pBaseVertexNum[i] = 0; m_pBaseVertexUseNum[i] = 0; m_pBaseIndexBuffer[i] = NULL; m_pBaseIndexNum[i] = 0; m_pBaseIndexUseNum[i] = 0; char strTex[256] = {0}; strcpy(strTex,m_pTextureDefs[i].m_strName); char *cptr = strrchr(strTex,'/'); if(cptr != NULL) { cptr++; strcat(cptr,".dds"); CTexture::SetPath(BSPTEXTUREPATH); m_pTextures[i].Load(cptr); } else { } } // LightMap Load for( i = 0; i < m_iLightMapsNum; i++ ) { byte m_ucLight[65536]; int icount = 0; int icount2 = 0; for(int j=0;j < 128;j++) { for(int k=0;k < 128;k++) { m_ucLight[icount2++] = m_pLightMaps[i].m_ucLightMap[icount+2]; //R m_ucLight[icount2++] = m_pLightMaps[i].m_ucLightMap[icount+1]; //G m_ucLight[icount2++] = m_pLightMaps[i].m_ucLightMap[icount]; //B m_ucLight[icount2++] = 0; icount +=3; } } m_pLightTextures[i].CreateEmptyTexture(128,128,0,D3DFMT_X8R8G8B8,D3DPOOL_MANAGED); //m_pLightTextures[i].FillTexture(m_pLightMaps[i].m_ucLightMap); m_pLightTextures[i].FillTexture(m_ucLight); } //////////////////// // Node fread((RBspNode *)m_pNodes,sizeof(RBspNode),m_iNodesNum,fp); // LeafExs for( i = 0; i < m_iLeafsNum; i++ ) { m_pLeafExs[i].m_pPickEventEffect = NULL; m_pLeafExs[i].m_pPickEventObject = NULL; m_pLeafExs[i].m_pPickEventSound = NULL; m_pLeafExs[i].m_pPickLight = NULL; m_pLeafExs[i].m_pPickTrigger = NULL; memset(m_pLeafExs[i].m_iEventNum,0,sizeof(int) * 10); int iEventNum[10]; fread((int *)iEventNum,sizeof(int),10,fp); int iArr[10]; fread((int *)iArr,sizeof(int),10,fp); int iObjectAni = iEventNum[RBSPEVENT_OBJECTANI]; int iEffect = iEventNum[RBSPEVENT_EFFECT]; int iSound = iEventNum[RBSPEVENT_SOUND]; int iLight = iArr[0]; int iTrigger = iArr[1]; int iAniObject = iArr[2]; int iR3SObject = iArr[3]; for(j = 0; j < iObjectAni; j++) { } for(j = 0; j < iEffect; j++) { RBspEventEffect pNode; fread((RBspEventEffect *)&pNode,sizeof(RBspEventEffect),1,fp); m_pLeafExs[i].InputEventEffect(pNode.m_strName,pNode.m_vecCenter,pNode.m_fDelay); } for( j = 0; j < iSound; j++) { RBspEventSound pNode; fread((RBspEventSound *)&pNode,sizeof(RBspEventSound),1,fp); m_pLeafExs[i].InputEventSound(pNode.m_strName,pNode.m_vecCenter,pNode.m_fDelay); } for( j = 0; j < iLight; j++) { RBspLight pNode; fread((RBspLight *)&pNode,sizeof(RBspLight),1,fp); m_pLeafExs[i].InputLight(pNode.m_iLightValue,pNode.m_vecLight,pNode.m_vecLightRange,(int)(pNode.m_fRed * 255.0f),(int)(pNode.m_fGreen * 255.0f),(int)(pNode.m_fBlue * 255.0f),false,false); } for( j = 0; j < iTrigger; j++ ) { } for( j = 0; j < iAniObject; j++ ) { } for( j = 0; j < iR3SObject; j++ ) { RBspR3S pNode; fread((RBspR3S *)&pNode,sizeof(RBspR3S),1,fp); m_pLeafExs[i].InputR3SObject(pNode.m_vecPos.x,pNode.m_vecPos.y,pNode.m_vecPos.z,pNode.m_strName,pNode.m_matTm,pNode.m_bAlpha,pNode.m_bLight); } int iBspArr[12]; fread((int *)iBspArr,sizeof(int),12,fp); m_pLeafExs[i].m_iAreaPotal = iBspArr[0]; m_pLeafExs[i].m_iCluster = iBspArr[1]; m_pLeafExs[i].m_iLeafBrush = iBspArr[2]; m_pLeafExs[i].m_iLeafBrushNum = iBspArr[3]; m_pLeafExs[i].m_iLeafFace = iBspArr[4]; m_pLeafExs[i].m_iLeafFaceNum = iBspArr[5]; m_pLeafExs[i].m_vecMaxBox[0] = iBspArr[6]; m_pLeafExs[i].m_vecMaxBox[1] = iBspArr[7]; m_pLeafExs[i].m_vecMaxBox[2] = iBspArr[8]; m_pLeafExs[i].m_vecMinBox[0] = iBspArr[9]; m_pLeafExs[i].m_vecMinBox[1] = iBspArr[10]; m_pLeafExs[i].m_vecMinBox[2] = iBspArr[11]; } // Leaf Face fread((int *)m_pLeafFaces,sizeof(int),m_iLeafFacesNum,fp); // Leaf Brushes fread((int *)m_pLeafBrushes,sizeof(int),m_iLeafBrushesNum,fp); // Plane fread((RBspPlane *)m_pPlanes,sizeof(RBspPlane),m_iPlanesNum,fp); // Brushe fread((RBspBrushe *)m_pBrushes,sizeof(RBspBrushe),m_iBrushesNum,fp); // BrusheSide fread((RBspBrusheSide *)m_pBrusheSides,sizeof(RBspBrusheSide),m_iBrusheSidesNum,fp); // Vertex Write fread((RBspDrawVertex *)m_pVerts,sizeof(RBspDrawVertex),m_iVertsNum,fp); //Scale fread((D3DXVECTOR3 *)&m_vecScale,sizeof(D3DXVECTOR3),1,fp); // ZeroPos fread((D3DXVECTOR3 *)&m_vecZeroPos,sizeof(D3DXVECTOR3),1,fp); fclose(fp); m_FaceRenderBit.ResizeBits(m_iFacesNum); // Face Render Bit Resize // Memory pool Create m_D3Device = CSceneManager::GetDevice(); CreateBufferNum(); CreateBuffer(); m_pFrustum = new CViewFrustum; CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); } return true; } bool RBspScene::SaveBseFile(char *strFilename) { int i,j; char strBuf[RBSPBUF_SIZE] = {0}; FILE *fp = NULL; fp = fopen(strFilename,"wb"); if(fp == NULL) { MessageBox(NULL,"File Create Failed",strFilename,MB_OK); return false; } else { memset(strBuf,0,sizeof(char) * RBSPBUF_SIZE); strcpy(strBuf,"BseFile"); WritetoFile(fp,strBuf); // Data Num Write int arrNum[11]; arrNum[0] = m_iVertsNum; arrNum[1] = m_iFacesNum; // arrNum[2] = m_iTextureDefsNum; // arrNum[3] = m_iLightMapsNum; // arrNum[4] = m_iNodesNum; // arrNum[5] = m_iLeafsNum; // arrNum[6] = m_iLeafFacesNum; // arrNum[7] = m_iPlanesNum; // arrNum[8] = m_iBrushesNum; // arrNum[9] = m_iBrusheSidesNum; // arrNum[10] = m_iLeafBrushesNum; // fwrite((int *)arrNum,sizeof(int),11,fp); // VisData Write int iAllocSize = m_VisData.m_iBytesPerCluster * m_VisData.m_iClustersNum; fwrite((int *)&(m_VisData.m_iBytesPerCluster),sizeof(int),1,fp); fwrite((int *)&(m_VisData.m_iClustersNum),sizeof(int),1,fp); fwrite((int *)&iAllocSize,sizeof(int),1,fp); fwrite((byte *)(m_VisData.m_pBitsets),sizeof(byte),iAllocSize,fp); // face write fwrite((RBspFace *)m_pFaces,sizeof(RBspFace),m_iFacesNum,fp); // Texture Define write fwrite((RBspTextureDef *)m_pTextureDefs,sizeof(RBspTextureDef),m_iTextureDefsNum,fp); // Lightmap write fwrite((RBspLightMap *)m_pLightMaps,sizeof(RBspLightMap),m_iLightMapsNum,fp); // Node fwrite((RBspNode *)m_pNodes,sizeof(RBspNode),m_iNodesNum,fp); // LeafExs for( i = 0; i < m_iLeafsNum; i++ ) { m_pLeafExs[i].m_pPickEventEffect = NULL; m_pLeafExs[i].m_pPickEventObject = NULL; m_pLeafExs[i].m_pPickEventSound = NULL; m_pLeafExs[i].m_pPickLight = NULL; m_pLeafExs[i].m_pPickTrigger = NULL; m_pLeafExs[i].m_pPickR3SObject = NULL; fwrite((int *)m_pLeafExs[i].m_iEventNum,sizeof(int),10,fp); int iArr[10]; int iObjectAni = m_pLeafExs[i].m_iEventNum[RBSPEVENT_OBJECTANI]; int iEffect = m_pLeafExs[i].m_iEventNum[RBSPEVENT_EFFECT]; int iSound = m_pLeafExs[i].m_iEventNum[RBSPEVENT_SOUND]; int iLight = m_pLeafExs[i].m_iLightNum; int iTrigger = m_pLeafExs[i].m_iTriggerNum; int iAniObject = m_pLeafExs[i].m_iAniObjectNum; int iR3SObjectNum = m_pLeafExs[i].m_iR3SObjectNum; iArr[0] = iLight; iArr[1] = iTrigger; iArr[2] = iAniObject; iArr[3] = iR3SObjectNum; fwrite((int *)iArr,sizeof(int),10,fp); for(j = 0; j < iObjectAni; j++) { } for(j = 0; j < iEffect; j++) { fwrite((RBspEventEffect *)(m_pLeafExs[i].m_lstEffect[j]),sizeof(RBspEventEffect),1,fp); } for( j = 0; j < iSound; j++) { fwrite((RBspEventSound *)(m_pLeafExs[i].m_lstSound[j]),sizeof(RBspEventSound),1,fp); } for( j = 0; j < iLight; j++) { m_pLeafExs[i].m_lstLight[j].m_pShadowVolume = NULL; fwrite((RBspLight *)&(m_pLeafExs[i].m_lstLight[j]),sizeof(RBspLight),1,fp); } for( j = 0; j < iTrigger; j++ ) { } for( j= 0; j < iAniObject; j++) { } for( j = 0; j < iR3SObjectNum; j++ ) { fwrite((RBspR3S *)(m_pLeafExs[i].m_lstR3SObject[j]),sizeof(RBspR3S),1,fp); } // Delete /*for( j = iObjectAni - 1; j >= 0; j-- ) { delete m_pLeafExs[i].m_lstObject[j]; m_pLeafExs[i].m_lstObject.erase(&(m_pLeafExs[i].m_lstObject[j])); } m_pLeafExs[i].m_lstObject.clear(); for( j = iEffect - 1; j >= 0; j-- ) { delete m_pLeafExs[i].m_lstEffect[j]; m_pLeafExs[i].m_lstEffect.erase(&(m_pLeafExs[i].m_lstEffect[j])); } m_pLeafExs[i].m_lstEffect.clear(); for( j= iSound - 1; j >= 0; j-- ) { delete m_pLeafExs[i].m_lstSound[j]; m_pLeafExs[i].m_lstSound.erase(&(m_pLeafExs[i].m_lstSound[j])); } m_pLeafExs[i].m_lstSound.clear(); for( j = iLight -1 ; j >= 0; j-- ) { m_pLeafExs[i].m_lstLight.erase(&(m_pLeafExs[i].m_lstLight[j])); } m_pLeafExs[i].m_lstLight.clear(); for( j = iTrigger -1 ; j >= 0; j--) { m_pLeafExs[i].m_lstTrigger.erase(&(m_pLeafExs[i].m_lstTrigger[j])); } m_pLeafExs[i].m_lstTrigger.clear(); for( j= iAniObject - 1; j >= 0; j--) { delete m_pLeafExs[i].m_lstAniObject[j]; m_pLeafExs[i].m_lstAniObject.erase(&(m_pLeafExs[i].m_lstAniObject[j])); } m_pLeafExs[i].m_lstAniObject.clear(); m_pLeafExs[i].m_iEventNum[RBSPEVENT_OBJECTANI] = 0; m_pLeafExs[i].m_iEventNum[RBSPEVENT_EFFECT] = 0; m_pLeafExs[i].m_iEventNum[RBSPEVENT_SOUND] = 0; m_pLeafExs[i].m_iLightNum = 0; m_pLeafExs[i].m_iTriggerNum = 0 ; m_pLeafExs[i].m_iAniObjectNum = 0;*/ ////// int iBspArr[12]; iBspArr[0] = m_pLeafExs[i].m_iAreaPotal; iBspArr[1] = m_pLeafExs[i].m_iCluster; iBspArr[2] = m_pLeafExs[i].m_iLeafBrush; iBspArr[3] = m_pLeafExs[i].m_iLeafBrushNum; iBspArr[4] = m_pLeafExs[i].m_iLeafFace; iBspArr[5] = m_pLeafExs[i].m_iLeafFaceNum; iBspArr[6] = m_pLeafExs[i].m_vecMaxBox[0]; iBspArr[7] = m_pLeafExs[i].m_vecMaxBox[1]; iBspArr[8] = m_pLeafExs[i].m_vecMaxBox[2]; iBspArr[9] = m_pLeafExs[i].m_vecMinBox[0]; iBspArr[10] = m_pLeafExs[i].m_vecMinBox[1]; iBspArr[11] = m_pLeafExs[i].m_vecMinBox[2]; fwrite((int *)iBspArr,sizeof(int),12,fp); } // Leaf Face fwrite((int *)m_pLeafFaces,sizeof(int),m_iLeafFacesNum,fp); // Leaf Brushes fwrite((int *)m_pLeafBrushes,sizeof(int),m_iLeafBrushesNum,fp); // Plane fwrite((RBspPlane *)m_pPlanes,sizeof(RBspPlane),m_iPlanesNum,fp); // Brushe fwrite((RBspBrushe *)m_pBrushes,sizeof(RBspBrushe),m_iBrushesNum,fp); // BrusheSide fwrite((RBspBrusheSide *)m_pBrusheSides,sizeof(RBspBrusheSide),m_iBrusheSidesNum,fp); // Vertex Write fwrite((RBspDrawVertex *)m_pVerts,sizeof(RBspDrawVertex),m_iVertsNum,fp); //Scale fwrite((D3DXVECTOR3 *)&m_vecScale,sizeof(D3DXVECTOR3),1,fp); // ZeroPos fwrite((D3DXVECTOR3 *)&m_vecZeroPos,sizeof(D3DXVECTOR3),1,fp); fclose(fp); } return true; } D3DXVECTOR3 RBspScene::WorldToLocalPos(D3DXVECTOR3 vecWorld) // World Position À» Local position À¸·Î.. { D3DXVECTOR3 vecPos = vecWorld; D3DXMATRIX matTmp; D3DXMATRIX matInv; D3DXMatrixIdentity(&matTmp); matTmp._41 = m_vecZeroPos.x; matTmp._42 = m_vecZeroPos.y; matTmp._43 = m_vecZeroPos.z; D3DXMatrixInverse(&matInv,NULL,&matTmp); D3DXMatrixIdentity(&matTmp); matTmp._41 = vecPos.x; matTmp._42 = vecPos.y; matTmp._43 = vecPos.z; D3DXMatrixMultiply(&matTmp,&matTmp,&matInv); vecPos.x = matTmp._41; vecPos.y = matTmp._42; vecPos.z = matTmp._43; return vecPos; } D3DXVECTOR3 RBspScene::LocalToWorldPos(D3DXVECTOR3 vecLocal) // Local Position À» World Position À¸·Î.. { D3DXVECTOR3 vecPos = vecLocal; D3DXMATRIX matTmp; D3DXMATRIX matInv; D3DXMatrixIdentity(&matTmp); matTmp._41 = m_vecZeroPos.x; matTmp._42 = m_vecZeroPos.y; matTmp._43 = m_vecZeroPos.z; matInv = matTmp; D3DXMatrixIdentity(&matTmp); matTmp._41 = vecPos.x; matTmp._42 = vecPos.y; matTmp._43 = vecPos.z; D3DXMatrixMultiply(&matTmp,&matTmp,&matInv); vecPos.x = matTmp._41; vecPos.y = matTmp._42; vecPos.z = matTmp._43; return vecPos; } void RBspScene::RenderR3SObject() // R3S Object Render { D3DMATERIAL8 mtrl; ZeroMemory( &mtrl, sizeof(D3DMATERIAL8) ); mtrl.Diffuse.r = mtrl.Ambient.r = 0.6f; mtrl.Diffuse.g = mtrl.Ambient.g = 0.6f; mtrl.Diffuse.b = mtrl.Ambient.b = 0.6f; mtrl.Diffuse.a = mtrl.Ambient.a = 0.6f; m_D3Device->SetMaterial( &mtrl ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); if(BaseGraphicsLayer::m_VoodooOption) CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE); else CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR ); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF, 0xee ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL ); m_D3Device->SetTexture(1,NULL); // m_D3Device->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight); CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE); D3DXMATRIX matBackup; m_D3Device->GetTransform(D3DTS_WORLD,&matBackup); for(int cObject = 0; cObject < m_ObjectSceneNode.num; cObject++) { //////////////////// Light for(int cLight=0;cLight<8;cLight++) { m_D3Device->LightEnable(cLight,FALSE); } D3DLIGHT8 pCurrentLight[4]; // ÃÖ´ë 4°³ ±îÁö D3DXVECTOR3 vecPos = D3DXVECTOR3(m_ObjectSceneNode[cObject]->m_TM._41,m_ObjectSceneNode[cObject]->m_TM._42,m_ObjectSceneNode[cObject]->m_TM._43); int iLightNum = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->CheckChrLight(vecPos,pCurrentLight,4); if(iLightNum > 0) { for(int cLNum = 1; cLNum < iLightNum + 1; cLNum++) { m_D3Device->SetLight(cLNum,&(pCurrentLight[cLNum - 1])); m_D3Device->LightEnable(cLNum,TRUE); } } else { m_D3Device->LightEnable(0,TRUE); D3DLIGHT8 light; light.Type = D3DLIGHT_POINT; light.Attenuation0=0.5f; light.Attenuation1=0.0f; light.Diffuse.r = CSceneManager::m_WeatherManager.m_InterCharacterLight.r/255.0f; light.Diffuse.g = CSceneManager::m_WeatherManager.m_InterCharacterLight.g/255.0f; light.Diffuse.b = CSceneManager::m_WeatherManager.m_InterCharacterLight.b/255.0f; vector3 vecLight(-1.0f,-1.0f,-1.0f); vecLight.Normalize(); light.Position.x = light.Direction.x =vecLight.x; light.Position.y = light.Direction.y =vecLight.y + 10000.0f; light.Position.z = light.Direction.z =vecLight.z; light.Range = 0.0f; m_D3Device->SetLight(0,&light); } /////////////////// D3DXVECTOR3 vecMin = D3DXVECTOR3(m_ObjectSceneNode[cObject]->m_vecMinBox.x, m_ObjectSceneNode[cObject]->m_vecMinBox.y, m_ObjectSceneNode[cObject]->m_vecMinBox.z); D3DXVECTOR3 vecMax = D3DXVECTOR3(m_ObjectSceneNode[cObject]->m_vecMaxBox.x, m_ObjectSceneNode[cObject]->m_vecMaxBox.y, m_ObjectSceneNode[cObject]->m_vecMaxBox.z); // vecMin matrix matTm = m_ObjectSceneNode[cObject]->m_TM; matrix matPos; matPos.MakeIdent(); matPos._41 = vecMin.x; matPos._42 = vecMin.y; matPos._43 = vecMin.z; matPos = matPos * matTm; vecMin.x = matPos._41; vecMin.y = matPos._42; vecMin.z = matPos._43; // vecMax matTm = m_ObjectSceneNode[cObject]->m_TM; matPos.MakeIdent(); matPos._41 = vecMax.x; matPos._42 = vecMax.y; matPos._43 = vecMax.z; matPos = matPos * matTm; vecMax.x = matPos._41; vecMax.y = matPos._42; vecMax.z = matPos._43; if(!m_pFrustum->BoxInFrustum(vecMin,vecMax)) continue; m_D3Device->SetTransform(D3DTS_WORLD,m_ObjectSceneNode[cObject]->m_TM); if(CSceneManager::m_PickObjectScene==m_ObjectSceneNode[cObject]) { if(CSceneManager::m_bIsPickObjectMoving==MOVE_OBJECT ) m_ObjectSceneNode[cObject]->m_pObject->RenderBox(m_D3Device); else { m_ObjectSceneNode[cObject]->m_pObject->Render(m_D3Device); m_ObjectSceneNode[cObject]->m_pObject->RenderBox(m_D3Device); } } else { m_ObjectSceneNode[cObject]->m_pObject->Render(m_D3Device); } } m_D3Device->SetTransform(D3DTS_WORLD,&matBackup); CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,FALSE); } void RBspScene::DynamicR3SLoad() { CSceneManager::m_ObjectContainer.DeleteAllObject(); for(int cObject=0;cObjectm_pObject==NULL) { m_ObjectSceneNode[cObject]->m_pObject= CSceneManager::m_ObjectContainer.GetObject( m_ObjectSceneNode[cObject]->m_strObjectName, m_ObjectSceneNode[cObject]->m_isAlpha, m_ObjectSceneNode[cObject]->m_isLight); m_ObjectSceneNode[cObject]->m_vecMaxBox=m_ObjectSceneNode[cObject]->m_pObject->m_MaxBox; m_ObjectSceneNode[cObject]->m_vecMinBox=m_ObjectSceneNode[cObject]->m_pObject->m_MinBox; m_ObjectSceneNode[cObject]->Init(); } } } void RBspScene::GenerateR3SObject() { int i; int j; int iTotalAdd = 0; for(int cObject=0;cObjectm_iR3SObjectNum; j++ ) { RBspR3S *pR3SInfo = pLeaf->m_lstR3SObject[j]; CObjectScene *AddObjectScene = new CObjectScene(); AddObjectScene->m_TM = pR3SInfo->m_matTm; AddObjectScene->m_AccumulateTM = pR3SInfo->m_matTm; AddObjectScene->m_pObject = NULL; strcpy(AddObjectScene->m_strObjectName,pR3SInfo->m_strName); AddObjectScene->m_isAlpha = pR3SInfo->m_bAlpha; AddObjectScene->m_isLight = pR3SInfo->m_bLight; AddObjectScene->m_isShadowed=false; AddObjectScene->m_ObjectID = iTotalAdd++; //AddObjectScene->Init(); m_ObjectSceneNode.Add(AddObjectScene); // picking ó¸® if(pLeaf->m_lstR3SObject[j]->m_iPickState == RBSPPICK_PICKED) CSceneManager::m_PickObjectScene = AddObjectScene; } } } DynamicR3SLoad(); }