#include "StdAfx.h" #include ".\mapportalscenenode.h" #include "ResourceManager.h" #include "CameraManager.h" #include "SceneManager.h" #include "LightAgent.h" #include "FogAgent.h" #include "NifAnimationInfo.h" #include "ObjectNameCard.h" #include "StageScript.h" #include "GameResourceManager.h" #include "RenderSystem.h" #include "NaviMesh.h" #include "ObjectManager.h" #include "hero.h" #include "PartyManager.h" #include "Application.h" cMapPortalSceneNode::cMapPortalSceneNode( eType type ) : cManagedStaticSceneNode(type) , mpNameCard(0) { mPortalIdx = 0; mPosScriptIdx = 0; mNameHeight = 0; } cMapPortalSceneNode::~cMapPortalSceneNode() { ClearCollectInfo(); SAFE_DELETE(mpNameCard); } void cMapPortalSceneNode::OnProcess( unsigned long deltaTime, unsigned long accumTime ) { cManagedStaticSceneNode::OnProcess( deltaTime, accumTime ); mPickedByCamera = false; if( mAlpha < 0.000001f ) mCheckFrustum = false; else mCheckFrustum = true; } bool cMapPortalSceneNode::Init( cMapPortalSceneNodeParam& param ) { mPosScriptIdx = param.mPosScriptIdx; sStageChangePos* pInfo = STAGESCRIPT->GetPosScriptInfo( mPosScriptIdx ); if( pInfo == 0 ) return false; mNameHeight = pInfo->mNameHeight; /// ÆÄÀÏÀ» ·Îµù param.mPathName += pInfo->mFileName; if( RESOURCEMAN->LoadNIF( param.mPathName.Cstr() ) == false ) { assert( 0 && "failed to load nif file" ); return false; } /// ¸®¼Ò½º °ü¸®ÀڷκÎÅÍ ¿£Áø ³ëµå¸¦ º¹Á¦ NiNode* n = RESOURCEMAN->CloneObjectByName( param.mPathName.Cstr() ); if( n == 0 ) { assert( 0 && "failed to clone node from resource manager" ); return false; } /// »óÀ§ ÃʱâÈ­ mSceneNiNode = n; NiFogProperty* pFog = NiNew NiFogProperty; pFog->SetFog( false ); n->AttachProperty( pFog ); if( cSceneNode::Init( param ) == false ) { return false; } /// create name card if( pInfo->mTargetInfo ) { mpNameCard = new cNameCard; mpNameCard->SetName( (LPTSTR)GAMERESOURCEMAN->GetMapName( pInfo->mTargetInfo->mMapNumber ), 0xFF19F0A0 ); } /// ¾Ö´Ï¸ÞÀÌ¼Ç ÄÁÆ®·Ñ·¯ Á¤º¸ ¼öÁý mNifAniInfo->CollectData( n ); if( mNifAniInfo->GetNumberOfControllers() ) { mNifAniInfo->SetAnimType( NiTimeController::APP_INIT ); mNifAniInfo->SetLooping( true ); //mNifAniInfo->Start( THEAPP->GetWorldAccumTime() * 0.001f ); } else { /// ¾Ö´Ï Á¤º¸°¡ ¾ø´Ù¸é ¸Þ¸ð¸® ÇØÁ¦ SAFE_DELETE(mNifAniInfo); } return true; } void cMapPortalSceneNode::AddToVisibleArray() { if( IsViewNode() == false ) return; cSceneNode::AddToVisibleArray(); if( mpNameCard ) { NiPoint3 pos = this->GetWorldTranslate(); pos.z += mNameHeight; bool showName = false; if( mIsMouseOver == false ) { NiPoint3 camPos = CAMERAMAN->GetCurrentNi()->GetWorldTranslate(); float distCam = (pos - camPos).Length(); float distHero = distCam; if( HERO ) distHero = (pos - HERO->GetPos()).Length(); if( distHero < 1500.0f ) distHero = 1500.0f; if( distHero > 10000.0f ) distHero = 10000.0f; if( distHero <= 3000.0f ) showName = true; } else { showName = true; } if( showName ) { float x,y; cPlane::WorldPtToScreenPt( CAMERAMAN->GetCurrentNi(), pos, x, y, false ); int ScreenPosX = (int)( x * RENDERSYS->GetScreenWidth() ); int ScreenPosY = (int)( (1.0f - y) * RENDERSYS->GetScreenHeight() ); mpNameCard->Set2DPos( ScreenPosX, ScreenPosY, 0, 0 ); SCENEMAN->AddPlane( mpNameCard ); } } } ////////////////////////////////////////////////////////////////////////// bool cUserPortalSceneNode::Init( cUserPortalSceneNodeParam& param ) { mPosScriptIdx = param.mPosScriptIdx; mPortalIdx = param.mPortalIdx; mOwnerIdx = param.mOwnerIdx; if( mPortalIdx == 0 ) return false; sStageChangePos* pInfo = STAGESCRIPT->GetPosScriptInfo( mPosScriptIdx ); if( pInfo == 0 ) return false; mNameHeight = pInfo->mNameHeight; if( RESOURCEMAN->LoadNIF( param.mPathName.Cstr() ) == false ) { assert( 0 && "failed to load nif file" ); return false; } /// ¸®¼Ò½º °ü¸®ÀڷκÎÅÍ ¿£Áø ³ëµå¸¦ º¹Á¦ NiNode* n = RESOURCEMAN->CloneObjectByName( param.mPathName.Cstr() ); if( n == 0 ) { assert( 0 && "failed to clone node from resource manager" ); return false; } /// »óÀ§ ÃʱâÈ­ mSceneNiNode = n; NiFogProperty* pFog = NiNew NiFogProperty; pFog->SetFog( false ); n->AttachProperty( pFog ); float height = 0.0f; NAVIMESH->CalcHeight( &height, param.mTranslate.x, param.mTranslate.y ); param.mTranslate.z = height; if( cSceneNode::Init( param ) == false ) { return false; } mpNameCard = new cNameCard; mpNameCard->SetName( (LPTSTR)GAMERESOURCEMAN->GetMapName( pInfo->mMapNumber ), 0xFF19F0A0 ); /// ¾Ö´Ï¸ÞÀÌ¼Ç ÄÁÆ®·Ñ·¯ Á¤º¸ ¼öÁý mNifAniInfo->CollectData( n ); if( mNifAniInfo->GetNumberOfControllers() ) { mNifAniInfo->SetAnimType( NiTimeController::APP_INIT ); mNifAniInfo->SetLooping( true ); //mNifAniInfo->Start( THEAPP->GetWorldAccumTime() * 0.001f ); } else { /// ¾Ö´Ï Á¤º¸°¡ ¾ø´Ù¸é ¸Þ¸ð¸® ÇØÁ¦ SAFE_DELETE(mNifAniInfo); } return true; } bool cUserPortalSceneNode::Pick( const cRay& ray ) { /// party or owner check if( PARTYMAN->IsHeroParty( mOwnerIdx ) == false ) { if( HERO->GetObjectID() != mOwnerIdx ) return false; } return cMapPortalSceneNode::Pick( ray ); }