////////////////////////////////////////////////////////////////////////// // CreateFromMeshNode ////////////////////////////////////////////////////////////////////////// void ZClothEmblem::CreateFromMeshNode( RMeshNode* pMeshNdoe_ , ZWorld* pWorld) { int i, nIndices; rvector vecDistance; mpMeshNode = pMeshNdoe_; m_nCntP = mpMeshNode->m_point_num; m_nCntC = mpMeshNode->m_face_num * 3 ; // Initialize m_pX = new rvector[m_nCntP]; m_pOldX = new rvector[m_nCntP]; m_pForce = new rvector[m_nCntP]; m_pHolds = new int [m_nCntP]; m_pWeights = new float [m_nCntP]; m_pNormal = new rvector[m_nCntP]; m_pConst = new sConstraint[m_nCntC]; memset( m_pForce , 0, sizeof(rvector)* m_nCntP ); memset( m_pHolds , 0, sizeof(bool) * m_nCntP ); memset( m_pWeights , 0, sizeof(float) * m_nCntP ); nIndices = pMeshNdoe_->m_face_num*3; //if( bHardwareBuffer ) //{ // SAFE_RELEASE(mIndexBuffer); // if( FAILED( RGetDevice()->CreateIndexBuffer(nIndices*sizeof(USHORT),0,D3DFMT_INDEX16,D3DPOOL_MANAGED,&mIndexBuffer))) // { // mlog( "Fail to Restore Index Buffer for Emblems..\n" ); // bHardwareBuffer = false; // } //} rmatrix World; rvector Pos = mpMeshNode->m_mat_base; rvector Dir = rvector(0,-1,0); rvector Up = rvector(0,0,1); MakeWorldMatrix(&World, Pos, Dir, Up); mWorldMat = mpMeshNode->m_mat_result * World; D3DXVECTOR4 rVec; for( i = 0 ; i < mpMeshNode->m_point_num; ++i ) { D3DXVec3Transform( &rVec, &mpMeshNode->m_point_list[i], &mWorldMat ); mpMeshNode->m_point_list[i] = (rvector)rVec; } // Copy Vertex memcpy( m_pX, mpMeshNode->m_point_list, sizeof(rvector) * m_nCntP ); memcpy( m_pOldX, mpMeshNode->m_point_list, sizeof(rvector) * m_nCntP ); // Build Constraints for( i = 0 ; i < mpMeshNode->m_face_num; ++i ) { for( int j = 0 ; j < 3; ++j ) { m_pConst[ i*3 + j ].refA = mpMeshNode->m_face_list[i].m_point_index[j]; if( j + 1 >= 3 ) { m_pConst[ i*3 + j ].refB = mpMeshNode->m_face_list[i].m_point_index[0]; } else { m_pConst[ i*3 + j ].refB = mpMeshNode->m_face_list[i].m_point_index[j+1]; } vecDistance = mpMeshNode->m_point_list[m_pConst[ i*3 + j ].refA] - mpMeshNode->m_point_list[m_pConst[ i*3 + j ].refB]; m_pConst[ i*3 + j ].restLength = D3DXVec3Length(&vecDistance); //g_index_buffer[i*3+j] = (USHORT)m_pConst[i*3+j].refA; } } // if( bHardwareBuffer ) // { // void* pIndices; // if(FAILED( mIndexBuffer->Lock(0,sizeof(USHORT)*nIndices,(VOID**)&pIndices,0))) // { // bHardwareBuffer = false; // mlog("Fail to Lock Index Buffer\n"); // } // else // { // memcpy( pIndices, g_index_buffer, sizeof(USHORT)*nIndices); // mIndexBuffer->Unlock(); // } // //// delete uIndexList; // } _ASSERT( mpMeshNode->m_point_color_num ); for( i = 0 ; i < m_nCntP; ++i ) { m_pHolds[i] = CLOTH_VALET_ONLY; // 만약 붉은색 성분이 있으면 & Exclusive with other Attribute... if( mpMeshNode->m_point_color_list[i].x != 0 ) { m_pHolds[i] = CLOTH_HOLD; } else { // 만약 파란색 성분이 있으면 : 힘! //if( mpMeshNode->m_point_color_list[i].z != 0 ) { m_pHolds[i] |= CLOTH_FORCE; } // 만약 녹색 성분이 있으면 : 충돌! if( mpMeshNode->m_point_color_list[i].y != 0 ) { m_pHolds[i] |= CLOTH_COLLISION; } } } // RLightList* pLightList = ZGetGame()->GetWorld()->GetBsp()->GetObjectLightList(); m_pWorld = pWorld; RLightList* pLightList = m_pWorld->GetBsp()->GetObjectLightList(); float minDistance = 999999; float fTemp; RLIGHT *pSelectedLight = 0; for(RLightList::iterator itor = pLightList->begin(); itor != pLightList->end(); ++itor ) { RLIGHT *pLight = *itor; fTemp = D3DXVec3Length( &(pLight->Position - m_pX[0]) ); if( fTemp < minDistance ) { minDistance = fTemp; pSelectedLight = pLight; } } mpLight = new D3DLIGHT9; memset( mpLight, 0, sizeof(D3DLIGHT9)); mpLight->Ambient.r = 0.3; mpLight->Ambient.g = 0.3; mpLight->Ambient.b = 0.3; if( pSelectedLight!=0 && minDistance < pSelectedLight->fAttnEnd ) { mpLight->Type = D3DLIGHT_POINT; mpLight->Diffuse.r = pSelectedLight->Color.x * pSelectedLight->fIntensity; mpLight->Diffuse.g = pSelectedLight->Color.y * pSelectedLight->fIntensity; mpLight->Diffuse.b = pSelectedLight->Color.z * pSelectedLight->fIntensity; mpLight->Position = pSelectedLight->Position; mpLight->Range = pSelectedLight->fAttnEnd; mpLight->Attenuation1 = 0.0001f; } else // 가까운 곳에 빛이 없으면 기본 라이팅 적용 { mpLight->Type = D3DLIGHT_DIRECTIONAL; mpLight->Diffuse.r = 0.1f; mpLight->Diffuse.g = 0.1f; mpLight->Diffuse.b = 0.1f; mpLight->Direction = rvector( 1, 1, 1 ); mpLight->Attenuation1 = 0.0f; mpLight->Attenuation0 = 0.0f; mpLight->Range = 0.0f; } //PreCalculate AABB float mostSmallX, mostSmallY, mostSmallZ; float mostBigX, mostBigY, mostBigZ; mostSmallX = mostSmallY = mostSmallZ = 9999999; mostBigX = mostBigY = mostBigZ = -9999999; rvector* pCurr; for( i = 0 ; i < m_nCntP; ++i ) { pCurr = &mpMeshNode->m_point_list[i]; mostSmallX = min( mostSmallX, pCurr->x ); mostSmallY = min( mostSmallY, pCurr->y ); mostSmallZ = min( mostSmallZ, pCurr->z ); mostBigX = max( mostBigX, pCurr->x ); mostBigY = max( mostBigY, pCurr->y ); mostBigZ = max( mostBigZ, pCurr->z ); } mAABB.vmin = rvector( mostSmallX - RESERVED_SPACE, mostSmallY - RESERVED_SPACE, mostSmallZ - RESERVED_SPACE ); mAABB.vmax = rvector( mostBigX + RESERVED_SPACE, mostBigY + RESERVED_SPACE, mostBigZ + RESERVED_SPACE ); mMyTime = 0; }
void ZCharacterObject::Draw_SetLight(const rvector& vPosition) { // ±¤¿øÁ¤ÀÇ // 0¹ø - ambient : ij¸¯ÅÍÀÇ ±âº» ¹à±â // - diffuse : ¼ø°£ÀûÀÎ ±¤¿ø( ÃÑ·ù¸¦ ¹ß»çÇÒ¶§ Àû¿ë) // 1¹ø - ambient : »ç¿ë¾ÈÇÔ // - diffuse : ¸ÊÀÇ µðÇ»Áî ¶óÀÌÆ® // specular, emit ¼Ó¼ºÀº »ç¿ë¾ÈÇÔ #define CHARACTER_AMBIENT 0.0 D3DLIGHT9 Light; rvector pos; rvector char_pos = vPosition; char_pos.z += 180.f; memset( &Light, 0, sizeof( D3DLIGHT9 )); // ÃʱâÈ // 0¹ø ¶óÀÌÆ® begine Light.Type = D3DLIGHT_POINT; Light.Ambient.r = CHARACTER_AMBIENT; Light.Ambient.g = CHARACTER_AMBIENT; Light.Ambient.b = CHARACTER_AMBIENT; Light.Specular.r = 1.f; Light.Specular.g = 1.f; Light.Specular.b = 1.f; Light.Specular.a = 1.f; if( ZGetConfiguration()->GetVideo()->bDynamicLight && m_bDynamicLight ) { m_vLightColor.x -= 0.03f; m_vLightColor.y -= 0.03f; m_vLightColor.z -= 0.03f; max( m_vLightColor.x, 0.0f ); max( m_vLightColor.y, 0.0f ); max( m_vLightColor.z, 0.0f ); Light.Diffuse.r = m_vLightColor.x; Light.Diffuse.g = m_vLightColor.y; Light.Diffuse.b = m_vLightColor.z; Light.Range = g_CharLightList[m_iDLightType].fRange; float lastTime = m_fTime; m_fTime = timeGetTime(); float lap = m_fTime - lastTime; m_fLightLife -= lap; if( m_fLightLife <= 0.0f ) { m_bDynamicLight = false; m_fLightLife = 0; } } else { m_bDynamicLight = false; m_vLightColor.x = 0.0f; m_vLightColor.y = 0.0f; m_vLightColor.z = 0.0f; } if( IsDoubleGun() ) { if( m_bLeftShot ) GetWeaponTypePos( weapon_dummy_muzzle_flash, &pos ,true); else GetWeaponTypePos( weapon_dummy_muzzle_flash, &pos ); m_bLeftShot = !m_bLeftShot; } else { GetWeaponTypePos( weapon_dummy_muzzle_flash, &pos ); } Light.Position.x = pos.x ; Light.Position.y = pos.y ; Light.Position.z = pos.z ; Light.Attenuation1 = 0.05f; Light.Attenuation2 = 0.001f; if (IsNPC()) { Light.Ambient.r = 0.4f; Light.Ambient.g = 0.4f; Light.Ambient.b = 0.4f; Light.Range = 2000.0f; Light.Attenuation0 = 1.0f; Light.Attenuation1 = 0.0f; Light.Attenuation2 = 0.0f; } // RGetDevice()->SetLight( 0, &Light ); // RGetDevice()->LightEnable( 0, TRUE ); // if( RShaderMgr::mbUsingShader ) // { // RGetShaderMgr()->setLight( 0, &Light ); // RGetShaderMgr()->LightEnable( 0, TRUE ); // } m_pVMesh->SetLight(0,&Light,false); // 0¹ø ¶óÀÌÆ® end // 1¹ø ¶óÀÌÆ® begine ZeroMemory( &Light, sizeof(D3DLIGHT9) ); RLightList* pLightList = 0; RLIGHT* pLight = 0; RLIGHT* pSelectedLight = 0; rvector sunDir; float distance; float SelectedLightDistance = FLT_MAX; pLightList = ZGetGame()->GetWorld()->GetBsp()->GetSunLightList(); int nLight = (int)pLightList->size(); Light.Specular.r = 1.f; Light.Specular.g = 1.f; Light.Specular.b = 1.f; Light.Specular.a = 1.f; if( nLight > 0 ) { // Áß°£¿¡ ¸Ê ÇÈÅ·ÀÌ ¾ÈµÇ¸é.. // ÇØ°¡ ¿©·¯°³À̸é? °Å¸®·Î ¼±ÅÃ.. for( RLightList::iterator iter = pLightList->begin(); iter != pLightList->end(); ++iter ) { pLight = *iter; sunDir = pLight->sPosition - char_pos; distance = D3DXVec3LengthSq( &sunDir ); D3DXVec3Normalize( &sunDir, &sunDir ); RBSPPICKINFO info; if( ZGetGame()->GetWorld()->GetBsp()->Pick( char_pos, sunDir, &info,RM_FLAG_ADDITIVE ) ) { if( distance > D3DXVec3LengthSq(&( char_pos - info.PickPos )) ) { continue; } } if( distance < SelectedLightDistance ) { SelectedLightDistance = distance; pSelectedLight = pLight; } } Light.Type = D3DLIGHT_POINT; Light.Attenuation1 = 0.00001f; if( pSelectedLight != 0 ) { Light.Diffuse.r = pSelectedLight->Color.x * pSelectedLight->fIntensity * 0.15f; Light.Diffuse.g = pSelectedLight->Color.y * pSelectedLight->fIntensity * 0.15f; Light.Diffuse.b = pSelectedLight->Color.z * pSelectedLight->fIntensity * 0.15f; } } SelectedLightDistance = FLT_MAX ; if( pSelectedLight == 0 ) { pLightList = ZGetGame()->GetWorld()->GetBsp()->GetObjectLightList(); // ¿©±â ÃÖÀûÈ°¡ ÂÀ ÇÊ¿äÇÏ´Ù for( RLightList::iterator itor = pLightList->begin(); itor != pLightList->end(); itor++ ) { RLIGHT *pl = *itor; float fDist = Magnitude( pl->sPosition-char_pos ); if( SelectedLightDistance > fDist ) { SelectedLightDistance = fDist; pSelectedLight = pl; } } Light.Type = D3DLIGHT_POINT; Light.Attenuation1 = 0.0025f; if( pSelectedLight != 0 ) { Light.Diffuse.r = pSelectedLight->Color.x * pSelectedLight->fIntensity; Light.Diffuse.g = pSelectedLight->Color.y * pSelectedLight->fIntensity; Light.Diffuse.b = pSelectedLight->Color.z * pSelectedLight->fIntensity; } } if( pSelectedLight != NULL ) { Light.Position = pSelectedLight->sPosition; // Light.Diffuse.r = pSelectedLight->Color.x; // Light.Diffuse.g = pSelectedLight->Color.y; // Light.Diffuse.b = pSelectedLight->Color.z; Light.Range = pSelectedLight->fAttnEnd; m_pVMesh->SetLight(1,&Light,false); // RGetDevice()->SetLight( 1, &Light ); // RGetDevice()->LightEnable( 1, TRUE ); // if( RShaderMgr::mbUsingShader ) // { // RGetShaderMgr()->setLight( 1, &Light ); // RGetShaderMgr()->LightEnable( 1, TRUE ); // RGetShaderMgr()->setLight( 0x00cccccc ); // } } else { m_pVMesh->SetLight(1,NULL,false); // RGetDevice()->LightEnable( 1, FALSE ); // if( RShaderMgr::mbUsingShader ) // { // RGetShaderMgr()->LightEnable( 1, FALSE ); // } } // 1¹ø ¶óÀÌÆ® end RGetShaderMgr()->setAmbient( 0x00cccccc ); RGetDevice()->SetRenderState( D3DRS_LIGHTING, TRUE ); RGetDevice()->SetRenderState( D3DRS_AMBIENT, 0x00cccccc ); }