示例#1
0
bool ZActor::ProcessMotion(float fDelta)
{
	if (!m_pVMesh) return false;

	m_pVMesh->Frame();

	rvector pos = m_Position;
	rvector dir = m_Direction;
	dir.z = 0;

	rmatrix world;
	MakeWorldMatrix(&world,rvector(0,0,0), dir,rvector(0,0,1));

	rvector MeshPosition ;
	MeshPosition = pos;

	MakeWorldMatrix(&world,pos,dir,rvector(0,0,1));
	m_pVMesh->SetWorldMatrix(world);

	UpdatePosition(fDelta);

	if(IsActiveModule(ZMID_LIGHTNINGDAMAGE)==false) {

		if (m_pVMesh->isOncePlayDone())
		{
			m_Animation.Input(ZA_ANIM_DONE);
		}
	}

	return true;
}
rvector ZRangeWeaponHitDice::ReturnShotDir()
{
	MakeHitProbability();

	rvector vTargetPos = m_TargetPosition;
	float fRandX=0.0f, fRandY=0.0f;

	float fRandMaxX = m_fTargetWidth+50.0f;
	float fRandMaxY = m_fTargetHeight+20.0f;

	
	if (RandomNumber(0.0f, 1.0f) <= m_fHitProbability)
	{
		float fHeight = m_fTargetHeight * 0.6f * 0.5f;
		float fWidth = m_fTargetWidth * 0.6f * 0.5f;
		// ИэСп
		fRandX = RandomNumber(-fWidth, fWidth);
		fRandY = RandomNumber(-fHeight, fHeight);
	}
	else
	{
		float fHeight = m_fTargetHeight * 0.8f * 0.5f;
		float fWidth = m_fTargetWidth * 0.8f * 0.5f;

		fRandX = RandomNumber(fWidth, fRandMaxX);
		fRandY = RandomNumber(fHeight, fRandMaxY);

		int dice = Dice(1, 2, 0);
		if (dice == 1) fRandX = -fRandX;
		dice = Dice(1, 2, 0);
		if (dice == 1) fRandY = -fRandY;
	}

	rmatrix mat;
	rvector modelDir = vTargetPos - m_SourcePosition;
	Normalize(modelDir);

	rvector tar(0,0,0);
	tar.x += fRandX;
	tar.y += fRandY;

	MakeWorldMatrix(&mat, m_TargetPosition, modelDir, rvector(0,0,1));
	tar = TransformCoord(tar, mat);

	rvector dir = tar - m_SourcePosition;
	Normalize(dir);

	return dir;
}
bool ZEffectAniMesh::Draw(unsigned long int nTime)
{
    if(m_VMesh.m_pMesh==NULL)
        return false;

    AniFrameInfo* pInfo = m_VMesh.GetFrameInfo(ani_mode_lower);

    if(pInfo->m_pAniSet==NULL)// m_VMesh.m_pAniSet[0]==NULL
        return false;

    if(nTime < m_nStartTime + m_nStartAddTime) {
        return true;
    }
    // 그리기가 연기 된경우 지금 상태의 캐릭터 데이터를 참조..

    if( m_bDelay && !m_isCheck ) {

        ZObject* pObj = ZGetObjectManager()->GetObject(m_uid);

        ZCharacterObject* pCObj = MDynamicCast(ZCharacterObject, pObj);

        if(pCObj) {

            if(!pCObj->IsRendered())
                return false;

            rvector _vp	  = pCObj->GetPosition();
            rvector _vdir = pCObj->m_Direction;
            _vdir.z = 0;
            Normalize(_vdir);

            /*
            int cm = g_pGame->SelectSlashEffectMotion(pObj);//남녀 칼 휘두르는 방향
            if(cm==SEM_ManSlash5) {
            	_vdir.z = 0.f;
            	_vp += _vdir * 120.f;
            	_vp.z -= 100.f;
            }
            else if(cm==SEM_WomanSlash5) {
            	_vdir.z = 0.f;
            	_vp += _vdir * 200.f;
            	_vp.z -= 80.f;
            }
            */

            m_Pos = _vp;
            m_Dir = _vdir;
        }

        m_isCheck = true;
    }

    DWORD dwDiff = nTime - m_nStartTime;

//	float fSec = (float)dwDiff/1000.0f;
//	float fOpacity = (SC_LIFETIME-dwDiff)/(float)SC_LIFETIME;

    rvector Dir;

    rvector Up=m_Up;

    if (m_nAlignType == 0) {
        Dir = -RCameraDirection;
    }
    else if( m_nAlignType == 1 )
    {
        Dir = m_DirOrg;
    }
    else if( m_nAlignType == 2 )
    {
        Dir = rvector( 0,1,0 );
        Up = rvector( 0,0,1 );
    }

    CheckCross(Dir,Up);

    rmatrix World;

    MakeWorldMatrix(&World, m_Pos, Dir, Up);

    rmatrix Rotation;

    D3DXMatrixRotationZ(&Rotation,m_fRotateAngleZ);
    World = Rotation * World;

    D3DXMatrixRotationY(&Rotation,m_fRotateAngleY);
    World = Rotation * World;

    m_VMesh.SetScale(m_Scale);
    m_VMesh.SetWorldMatrix(World);
    m_VMesh.Frame();					// 시간은 흘러 가야 한다~

    if(m_bRender) {
        m_VMesh.Render();
        m_bisRendered = m_VMesh.m_bIsRender;
    }
    else m_bisRendered = false;

    if( m_nAutoAddEffect != ZEffectAutoAddType_None ) {

        rvector vPos;
        RMeshNode* pNode = NULL;

        if(m_nAutoAddEffect == ZEffectAutoAddType_Methor ) {

            pNode = m_VMesh.m_pMesh->GetMeshData("methor");

            vPos.x = pNode->m_mat_result._41;
            vPos.y = pNode->m_mat_result._42;
            vPos.z = pNode->m_mat_result._43;

//			static rmatrix _mrot = RGetRotY(180) * RGetRotX(90);
            static rmatrix _mrot = RGetRotX(90);

            vPos = vPos * _mrot;
            vPos += m_Pos;

            if(m_vBackupPos != vPos) {
                ZGetEffectManager()->AddTrackMethor(vPos);
                m_vBackupPos = vPos;
            }
        }
    }

    if( m_nLifeTime != -1 && m_bLoopType ) {// 소멸 시간이 정해져 있고..에니메이션이 루프 타잎인 경우..
        if(m_VMesh.isOncePlayDone())
            if(nTime > m_nStartTime + m_nLifeTime) {
                return false;
            }
    }
    else {
        if(m_VMesh.isOncePlayDone()) {
            return false;
        }
    }

    return true;
}
示例#4
0
//////////////////////////////////////////////////////////////////////////
//	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;
}